logo

Třída nebo statické proměnné v Pythonu

Všechny objekty sdílejí třídy nebo statické proměnné. Instance nebo nestatické proměnné jsou různé pro různé objekty (každý objekt má kopii). Nechte například studenta informatiky zastupovat třída CSSstudent . Třída může mít statickou proměnnou, jejíž hodnota je cse pro všechny objekty. A třída může mít také nestatické členy jako název a válec .

V C++ a Java můžeme použít statická klíčová slova, abychom z proměnné udělali proměnnou třídy. Proměnné, které nemají předchozí statické klíčové slovo, jsou proměnné instance. Viz toto pro příklad Java a toto pro příklad C++.



Vysvětlení:

V Pythonu je statická proměnná proměnná, která je sdílena mezi všemi instancemi třídy, spíše než aby byla jedinečná pro každou instanci. Někdy se také označuje jako proměnná třídy, protože patří spíše do třídy samotné než do nějaké konkrétní instance třídy.

Statické proměnné jsou definovány uvnitř definice třídy, ale mimo jakékoli definice metod. Obvykle jsou inicializovány hodnotou, stejně jako proměnná instance, ale lze k nim přistupovat a upravovat je prostřednictvím samotné třídy, nikoli prostřednictvím instance.

Vlastnosti statických proměnných

  • Statické proměnné jsou přiděleny paměti jednou, když je objekt pro třídu vytvořen poprvé.
  • Statické proměnné se vytvářejí mimo metody, ale uvnitř třídy
  • Ke statickým proměnným lze přistupovat prostřednictvím třídy, ale ne přímo pomocí instance.
  • Chování statických proměnných se nemění u každého objektu.

Přístup Pythonu je jednoduchý; nevyžaduje statické klíčové slovo.



Poznámka: Všechny proměnné, kterým je přiřazena hodnota v a deklarace třídy jsou proměnné třídy. A proměnné že jsou přiřazeny hodnoty uvnitř metod jsou proměnné instance.

sort array list java

Příklad:

Krajta






# 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'>

>

>

Výstup

cse cse Geek Nerd 1 2 cse ece cse ece mech>

Výstup:

cse cse Geek Nerd 1 2 cse ece cse ece mech>

Příklad:

Krajta




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>

>

>

Výstup

1 2 2>

Vysvětlení:

v tomto příkladu definujeme třídu MyClass, která má statickou proměnnou static_var inicializovanou na 0. Definujeme také proměnnou instance instance_var, která je jedinečná pro každou instanci třídy.

Když vytvoříme instanci třídy (obj1), zvýšíme hodnotu statické proměnné o 1 a přiřadíme ji k proměnné instance. Když vytvoříme další instanci třídy (obj2), znovu inkrementujeme statickou proměnnou a přiřadíme novou hodnotu proměnné instance pro tuto instanci.

Nakonec vytiskneme hodnotu statické proměnné pomocí samotné třídy, nikoli instance třídy. Jak vidíte, hodnota statické proměnné je sdílena mezi všemi instancemi třídy a je zvýšena pokaždé, když je vytvořena nová instance.

Statické proměnné mohou být užitečné pro udržování stavu napříč všemi instancemi třídy nebo pro sdílení dat mezi všemi instancemi třídy. Je však důležité je používat opatrně a zajistit, aby jejich hodnoty byly synchronizovány se stavem programu, zejména ve vícevláknovém prostředí.

výhody:

    Efektivita paměti: Protože statické proměnné jsou sdíleny mezi všemi instancemi třídy, mohou ušetřit paměť tím, že se vyhnou nutnosti vytvářet více kopií stejných dat. Sdílený stav: Statické proměnné mohou poskytnout způsob, jak udržovat sdílený stav napříč všemi instancemi třídy, což umožňuje všem instancím přistupovat ke stejným datům a upravovat je. Snadný přístup: Ke statickým proměnným lze přistupovat pomocí samotného názvu třídy, aniž byste potřebovali instanci třídy. To může usnadnit přístup a úpravu dat uložených ve statické proměnné. Inicializace: Statické proměnné lze inicializovat, když je třída definována, což usnadňuje zajištění, že proměnná má platnou počáteční hodnotu. Čitelnost: Statické proměnné mohou zlepšit čitelnost kódu, protože jasně ukazují, že data uložená v proměnné jsou sdílena všemi instancemi třídy.

Nevýhody:

    Neflexibilita: Statické proměnné mohou být nepružné, protože jejich hodnoty jsou sdíleny napříč všemi instancemi třídy, takže je obtížné mít různé hodnoty pro různé instance. Skryté závislosti: Statické proměnné mohou vytvářet skryté závislosti mezi různými částmi kódu, což ztěžuje pochopení a úpravu kódu. Bezpečnost vlákna: Statické proměnné mohou být problematické v prostředí s více vlákny, protože mohou způsobit konflikty a problémy se synchronizací, pokud nejsou správně synchronizovány. Znečištění jmenného prostoru: Statické proměnné se mohou přidat do jmenného prostoru třídy, což může způsobit konflikty jmen a ztížit údržbu kódu. Testování: Statické proměnné mohou ztížit psaní efektivních jednotkových testů, protože stav statické proměnné může ovlivnit chování třídy a jejích metod.

Celkově mohou být statické proměnné užitečným nástrojem v programování v Pythonu, ale měly by být používány opatrně a s ohledem na potenciální nevýhody, jako je nepružnost, skryté závislosti a obavy o bezpečnost vláken.