Alle objekter deler klasse eller statiske variable. En instans eller ikke-statiske variable er forskellige for forskellige objekter (hvert objekt har en kopi). Lad for eksempel en datalogistuderende være repræsenteret af en klasse CSStudent . Klassen kan have en statisk variabel, hvis værdi er cse for alle objekter. Og klasse kan også have ikke-statiske medlemmer som navn og rulle .
I C++ og Java kan vi bruge statiske nøgleord til at gøre en variabel til en klassevariabel. De variabler, der ikke har et forudgående statisk søgeord, er instansvariabler. Se dette for Java-eksemplet og dette for C++-eksemplet.
Forklaring:
I Python er en statisk variabel en variabel, der deles mellem alle forekomster af en klasse, snarere end at være unik for hver forekomst. Det omtales også nogle gange som en klassevariabel, fordi den tilhører selve klassen snarere end nogen bestemt forekomst af klassen.
Statiske variable er defineret inde i klassedefinitionen, men uden for enhver metodedefinition. De initialiseres typisk med en værdi, ligesom en instansvariabel, men de kan tilgås og ændres gennem selve klassen i stedet for gennem en instans.
Funktioner af statiske variabler
- Statiske variable tildeles hukommelse én gang, når objektet til klassen oprettes for første gang.
- Statiske variable skabes uden for metoder, men inde i en klasse
- Statiske variabler kan tilgås gennem en klasse, men ikke direkte med en instans.
- Statiske variables adfærd ændres ikke for hvert objekt.
Python-tilgangen er enkel; det kræver ikke et statisk søgeord.
Bemærk: Alle variabler, som er tildelt en værdi i det klassedeklaration er klassevariable. Og variabler at er tildelt værdier inde i metoder er instansvariabler.
ascii af a i java
Eksempel:
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'> |
>
>Produktion
cse cse Geek Nerd 1 2 cse ece cse ece mech>
Produktion:
cse cse Geek Nerd 1 2 cse ece cse ece mech>
Eksempel:
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> |
>
>Produktion
1 2 2>
Forklaring:
i dette eksempel definerer vi en klasse MyClass, der har en statisk variabel static_var initialiseret til 0. Vi definerer også en instansvariabel instans_var, der er unik for hver instans af klassen.
Når vi opretter en instans af klassen (obj1), øger vi værdien af den statiske variabel med 1 og tildeler den til instansvariablen. Når vi opretter en anden instans af klassen (obj2), øger vi den statiske variabel igen og tildeler den nye værdi til instansvariablen for den instans.
Til sidst udskriver vi værdien af den statiske variabel ved hjælp af selve klassen i stedet for en forekomst af klassen. Som du kan se, deles værdien af den statiske variabel mellem alle forekomster af klassen, og den øges hver gang en ny forekomst oprettes.
Statiske variabler kan være nyttige til at opretholde tilstand på tværs af alle forekomster af en klasse eller til at dele data mellem alle forekomster af en klasse. Det er dog vigtigt at bruge dem omhyggeligt og at sikre, at deres værdier er synkroniseret med programmets tilstand, især i et flertrådsmiljø.
Fordele:
- Hukommelseseffektivitet: Da statiske variabler deles mellem alle forekomster af en klasse, kan de spare hukommelse ved at undgå behovet for at oprette flere kopier af de samme data. Delt tilstand: Statiske variabler kan give en måde at opretholde delt tilstand på tværs af alle forekomster af en klasse, hvilket giver alle forekomster adgang til og ændre de samme data. Let at få adgang til: Statiske variabler kan tilgås ved hjælp af selve klassenavnet, uden at du behøver en forekomst af klassen. Dette kan gøre det mere bekvemt at få adgang til og ændre de data, der er gemt i en statisk variabel. Initialisering : Statiske variable kan initialiseres, når klassen er defineret, hvilket gør det nemt at sikre, at variablen har en gyldig startværdi. Læsbarhed : Statiske variabler kan forbedre kodens læsbarhed, da de tydeligt angiver, at de data, der er lagret i variablen, deles mellem alle forekomster af klassen.
Ulemper:
- Ufleksibilitet: Statiske variable kan være ufleksible, da deres værdier deles på tværs af alle forekomster af klassen, hvilket gør det vanskeligt at have forskellige værdier for forskellige forekomster. Skjulte afhængigheder : Statiske variable kan skabe skjulte afhængigheder mellem forskellige dele af koden, hvilket gør det vanskeligt at forstå og ændre koden. Trådsikkerhed: Statiske variabler kan være problematiske i et flertrådsmiljø, da de kan introducere raceforhold og synkroniseringsproblemer, hvis de ikke synkroniseres korrekt. Navneområdeforurening: Statiske variabler kan tilføjes til klassens navneområde, hvilket potentielt kan forårsage navnekonflikter og gøre det sværere at vedligeholde koden. Test: Statiske variable kan gøre det sværere at skrive effektive enhedstests, da den statiske variabels tilstand kan påvirke klassens adfærd og dens metoder.
Overordnet set kan statiske variable være et nyttigt værktøj i Python-programmering, men de bør bruges med omhu og opmærksomhed på potentielle ulemper, såsom ufleksibilitet, skjulte afhængigheder og bekymringer om trådsikkerhed.