Alla objekt delar klass eller statiska variabler. En instans eller icke-statiska variabler är olika för olika objekt (varje objekt har en kopia). Låt till exempel en datavetenskapsstudent representeras av en klass CSStudent . Klassen kan ha en statisk variabel vars värde är cse för alla objekt. Och klass kan också ha icke-statiska medlemmar som namn och rulla .
I C++ och Java kan vi använda statiska nyckelord för att göra en variabel till en klassvariabel. Variablerna som inte har ett föregående statiskt nyckelord är instansvariabler. Se detta för Java-exemplet och detta för C++-exemplet.
Förklaring:
I Python är en statisk variabel en variabel som delas mellan alla instanser av en klass, snarare än att vara unik för varje instans. Den kallas också ibland för en klassvariabel, eftersom den tillhör själva klassen snarare än någon speciell instans av klassen.
Statiska variabler definieras i klassdefinitionen, men utanför alla metoddefinitioner. De initieras vanligtvis med ett värde, precis som en instansvariabel, men de kan nås och modifieras genom själva klassen, snarare än genom en instans.
Funktioner hos statiska variabler
- Statiska variabler tilldelas minne en gång när objektet för klassen skapas för första gången.
- Statiska variabler skapas utanför metoder men inom en klass
- Statiska variabler kan nås via en klass men inte direkt med en instans.
- Statiska variablers beteende förändras inte för varje objekt.
Python-metoden är enkel; det kräver inte ett statiskt nyckelord.
Notera: Alla variabler som tilldelas ett värde i de klassdeklaration är klassvariabler. Och variabler den där är tilldelade värden inuti metoder är instansvariabler.
nackdelar med internet
Exempel:
Pytonorm
# 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>
Exempel:
Pytonorm
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>
Förklaring:
i det här exemplet definierar vi en klass MyClass som har en statisk variabel static_var initierad till 0. Vi definierar också en instansvariabel instans_var som är unik för varje instans av klassen.
När vi skapar en instans av klassen (obj1), ökar vi värdet på den statiska variabeln med 1 och tilldelar den till instansvariabeln. När vi skapar en annan instans av klassen (obj2), inkrementerar vi den statiska variabeln igen och tilldelar det nya värdet till instansvariabeln för den instansen.
Slutligen skriver vi ut värdet på den statiska variabeln med hjälp av själva klassen, snarare än en instans av klassen. Som du kan se delas värdet på den statiska variabeln mellan alla instanser av klassen, och det ökas varje gång en ny instans skapas.
Statiska variabler kan vara användbara för att upprätthålla tillstånd över alla instanser av en klass, eller för att dela data mellan alla instanser av en klass. Det är dock viktigt att använda dem försiktigt och att se till att deras värden är synkroniserade med programmets tillstånd, särskilt i en flertrådsmiljö.
Fördelar:
- Minneseffektivitet: Eftersom statiska variabler delas mellan alla instanser av en klass, kan de spara minne genom att undvika behovet av att skapa flera kopior av samma data. Delat tillstånd: Statiska variabler kan ge ett sätt att upprätthålla delat tillstånd för alla instanser av en klass, vilket gör att alla instanser kan komma åt och ändra samma data. Lätt att komma åt: Statiska variabler kan nås med själva klassnamnet, utan att behöva en instans av klassen. Detta kan göra det mer bekvämt att komma åt och ändra data som lagras i en statisk variabel. Initialisering : Statiska variabler kan initieras när klassen är definierad, vilket gör det enkelt att säkerställa att variabeln har ett giltigt startvärde. Läsbarhet : Statiska variabler kan förbättra kodens läsbarhet, eftersom de tydligt indikerar att data som lagras i variabeln delas mellan alla instanser av klassen.
Nackdelar:
- Inflexibilitet : Statiska variabler kan vara oflexibla, eftersom deras värden delas mellan alla instanser av klassen, vilket gör det svårt att ha olika värden för olika instanser. Dolda beroenden : Statiska variabler kan skapa dolda beroenden mellan olika delar av koden, vilket gör det svårt att förstå och modifiera koden. Trådsäkerhet : Statiska variabler kan vara problematiska i en miljö med flera trådar, eftersom de kan introducera tävlingsförhållanden och synkroniseringsproblem om de inte synkroniseras korrekt. Namnutrymmesförorening: Statiska variabler kan lägga till klassens namnutrymme, vilket kan orsaka namnkonflikter och göra det svårare att underhålla koden. Testning: Statiska variabler kan göra det svårare att skriva effektiva enhetstester, eftersom tillståndet för den statiska variabeln kan påverka klassens beteende och dess metoder.
Sammantaget kan statiska variabler vara ett användbart verktyg i Python-programmering, men de bör användas med försiktighet och uppmärksamhet på potentiella nackdelar, såsom oflexibilitet, dolda beroenden och problem med trådsäkerhet.