További
Lehetségesek-e statikus osztályváltozók Pythonban?
Lehetséges, hogy a Pythonban statikus osztályváltozók vagy metódusok legyenek? Milyen szintaxis szükséges ehhez?
1797
3
Az osztálydefinícióban, de nem egy metódusban deklarált változók osztály- vagy statikus változók:
Amint arra @millerdev rámutat, ez egy osztályszintű
i
változót hoz létre, de ez különbözik bármely példányszintűi
változótól, így lehet, hogy aEz különbözik a C++-tól és a Javától, de nem annyira különbözik a C#-tól, ahol egy statikus taghoz nem lehet hozzáférni egy példányra való hivatkozással.
Lásd mit mond a Python oktatókönyv az osztályok és osztályobjektumok témájában.
@Steve Johnson már válaszolt a statikus metódusokkal kapcsolatban, amelyek szintén a "Beépített függvények" a Python Library Reference-ban dokumentálva vannak.
@beidy a classmethod-ot ajánlja a staticmethod helyett, mivel a metódus ekkor az osztály típusát kapja első argumentumként, de én még egy kicsit homályosan látom ennek a megközelítésnek az előnyeit a staticmethodhoz képest. Ha te is, akkor valószínűleg nem számít.
Én személy szerint mindig classmethod-t használnék, amikor statikus metódusra van szükségem. Főleg azért, mert az osztályt kapom argumentumként.
vagy egy dekorátort használok.
Statikus tulajdonságok esetén.. Itt az ideje, hogy utánanézz néhány python definíciónak... a változó mindig változhat. Két típusuk van, a mutable és az immutable... Továbbá vannak osztály attribútumok és példány attribútumok... Semmi sem hasonlít a statikus attribútumokhoz a java & c++ értelmében.
Miért használjunk statikus metódust pythoni értelemben, ha nincs semmilyen kapcsolata az osztállyal! A helyedben én vagy classmethod-t használnék, vagy az osztálytól független metódust definiálnám.
A statikus módszereket pythonban classmethod-nak hívják. Nézzük meg a következő kódot
Vegyük észre, hogy amikor meghívjuk a myInstanceMethod metódust, hibát kapunk. Ennek az az oka, hogy a metódust az osztály egy példányán kell meghívni. A myStaticMethod metódus a decorator @classmethod segítségével classmethodként van beállítva.
Csak a vicc kedvéért meghívhatjuk az myInstanceMethod metódust az osztályon az osztály egy példányának átadásával, így: