Alle objecten delen klasse- of statische variabelen. Een instantie of niet-statische variabelen zijn verschillend voor verschillende objecten (elk object heeft een kopie). Laat een student computerwetenschappen bijvoorbeeld vertegenwoordigd worden door een klas CSSstudent . De klasse kan een statische variabele hebben waarvan de waarde cse is voor alle objecten. En klasse kan ook niet-statische leden hebben, zoals naam En rollen .
In C++ en Java kunnen we statische trefwoorden gebruiken om van een variabele een klassevariabele te maken. De variabelen die geen voorafgaand statisch trefwoord hebben, zijn instantievariabelen. Zie dit voor het Java-voorbeeld en dit voor het C++-voorbeeld.
Uitleg:
In Python is een statische variabele een variabele die wordt gedeeld door alle instanties van een klasse, in plaats van uniek te zijn voor elke instantie. Er wordt ook wel naar verwezen als een klassevariabele, omdat deze tot de klasse zelf behoort en niet tot een bepaalde instantie van de klasse.
Statische variabelen worden gedefinieerd binnen de klassendefinitie, maar buiten eventuele methodedefinities. Ze worden doorgaans geïnitialiseerd met een waarde, net als een instantievariabele, maar ze kunnen worden geopend en gewijzigd via de klasse zelf, in plaats van via een instantie.
Kenmerken van statische variabelen
- Aan statische variabelen wordt eenmaal geheugen toegewezen wanneer het object voor de klasse voor de eerste keer wordt gemaakt.
- Statische variabelen worden buiten de methoden gemaakt, maar binnen een klasse
- Statische variabelen zijn toegankelijk via een klasse, maar niet rechtstreeks via een instantie.
- Het gedrag van statische variabelen verandert niet voor elk object.
De Python-aanpak is eenvoudig; er is geen statisch trefwoord voor nodig.
Opmerking: Alle variabelen waaraan een waarde is toegekend de class-declaratie zijn klassevariabelen. En variabelen Dat zijn toegewezen waarden binnen methoden zijn instantievariabelen.
hernoem map linux
Voorbeeld:
Python
# Python program to show that the variables with a value> # assigned in class declaration, are class variables> # Class for Computer Science Student> class> CSStudent:> >stream>=> 'cse'> # Class Variable> >def> __init__(>self>,name,roll):> >self>.name>=> name># Instance Variable> >self>.roll>=> roll># Instance Variable> # Objects of CSStudent class> a>=> CSStudent(>'Geek'>,>1>)> b>=> CSStudent(>'Nerd'>,>2>)> print>(a.stream)># prints 'cse'> print>(b.stream)># prints 'cse'> print>(a.name)># prints 'Geek'> print>(b.name)># prints 'Nerd'> print>(a.roll)># prints '1'> print>(b.roll)># prints '2'> # Class variables can be accessed using class> # name also> print>(CSStudent.stream)># prints 'cse'> # Now if we change the stream for just a it won't be changed for b> a.stream>=> 'ece'> print>(a.stream)># prints 'ece'> print>(b.stream)># prints 'cse'> # To change the stream for all instances of the class we can change it> # directly from the class> CSStudent.stream>=> 'mech'> print>(a.stream)># prints 'ece'> print>(b.stream)># prints 'mech'> |
>
>Uitvoer
cse cse Geek Nerd 1 2 cse ece cse ece mech>
Uitgang:
cse cse Geek Nerd 1 2 cse ece cse ece mech>
Voorbeeld:
Python
class> MyClass:> >static_var>=> 0> >def> __init__(>self>):> >MyClass.static_var>+>=> 1> >self>.instance_var>=> MyClass.static_var> obj1>=> MyClass()> print>(obj1.instance_var)># Output: 1> obj2>=> MyClass()> print>(obj2.instance_var)># Output: 2> print>(MyClass.static_var)># Output: 2> |
>
>Uitvoer
1 2 2>
Uitleg:
in dit voorbeeld definiëren we een klasse MyClass met een statische variabele static_var geïnitialiseerd op 0. We definiëren ook een instantievariabele instance_var die uniek is voor elke instantie van de klasse.
Wanneer we een instantie van de klasse (obj1) maken, verhogen we de waarde van de statische variabele met 1 en wijzen deze toe aan de instantievariabele. Wanneer we een andere instantie van de klasse (obj2) maken, verhogen we de statische variabele opnieuw en wijzen we de nieuwe waarde toe aan de instantievariabele voor die instantie.
Ten slotte drukken we de waarde van de statische variabele af met behulp van de klasse zelf, in plaats van een instantie van de klasse. Zoals u kunt zien, wordt de waarde van de statische variabele gedeeld door alle instanties van de klasse, en wordt deze verhoogd elke keer dat er een nieuwe instantie wordt gemaakt.
Statische variabelen kunnen nuttig zijn voor het behouden van de status van alle instanties van een klasse, of voor het delen van gegevens tussen alle instanties van een klasse. Het is echter belangrijk om ze zorgvuldig te gebruiken en ervoor te zorgen dat hun waarden worden gesynchroniseerd met de status van het programma, vooral in een omgeving met meerdere threads.
Voordelen:
- Geheugenefficiëntie: Omdat statische variabelen worden gedeeld door alle instanties van een klasse, kunnen ze geheugen besparen door de noodzaak te vermijden om meerdere kopieën van dezelfde gegevens te maken. Gedeelde status: Statische variabelen kunnen een manier bieden om een gedeelde status te behouden voor alle instanties van een klasse, waardoor alle instanties toegang hebben tot dezelfde gegevens en deze kunnen wijzigen. Gemakkelijk toegankelijk: Statische variabelen zijn toegankelijk via de klassenaam zelf, zonder dat een instantie van de klasse nodig is. Dit kan het gemakkelijker maken om toegang te krijgen tot de gegevens die zijn opgeslagen in een statische variabele en deze te wijzigen. Initialisatie: Statische variabelen kunnen worden geïnitialiseerd wanneer de klasse is gedefinieerd, waardoor het gemakkelijk wordt om ervoor te zorgen dat de variabele een geldige startwaarde heeft. Leesbaarheid: Statische variabelen kunnen de leesbaarheid van de code verbeteren, omdat ze duidelijk aangeven dat de gegevens die in de variabele zijn opgeslagen, worden gedeeld door alle instanties van de klasse.
Nadelen:
- Inflexibiliteit: Statische variabelen kunnen inflexibel zijn, omdat hun waarden worden gedeeld door alle instanties van de klasse, waardoor het moeilijk wordt om verschillende waarden te hebben voor verschillende instanties. Verborgen afhankelijkheden: Statische variabelen kunnen verborgen afhankelijkheden creëren tussen verschillende delen van de code, waardoor het moeilijk wordt om de code te begrijpen en aan te passen. Thread-veiligheid: Statische variabelen kunnen problematisch zijn in een omgeving met meerdere threads, omdat ze racecondities en synchronisatieproblemen kunnen introduceren als ze niet goed zijn gesynchroniseerd. Vervuiling van de naamruimte: statische variabelen kunnen bijdragen aan de naamruimte van de klasse, waardoor naamconflicten kunnen ontstaan en het moeilijker wordt om de code te onderhouden. Testen: Statische variabelen kunnen het moeilijker maken om effectieve unit-tests te schrijven, omdat de status van de statische variabele het gedrag van de klasse en zijn methoden kan beïnvloeden.
Over het algemeen kunnen statische variabelen een nuttig hulpmiddel zijn bij het programmeren in Python, maar ze moeten met zorg worden gebruikt en aandacht besteden aan mogelijke nadelen, zoals inflexibiliteit, verborgen afhankelijkheden en zorgen over de veiligheid van threads.