Lehetséges, hogy a Pythonban statikus osztályváltozók vagy metódusok legyenek? Milyen szintaxis szükséges ehhez?
Az osztálydefinícióban, de nem egy metódusban deklarált változók osztály- vagy statikus változók:
>>> class MyClass:
... i = 3
...
>>> MyClass.i
3
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 a
>>> m = MyClass()
>>> m.i = 4
>>> MyClass.i, m.i
>>> (3, 4)
Ez 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.
class C:
@staticmethod
def f(arg1, arg2, ...): ...
@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.
class myObj(object):
def myMethod(cls)
...
myMethod = classmethod(myMethod)
vagy egy dekorátort használok.
class myObj(object):
@classmethod
def myMethod(cls)
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
class MyClass:
def myInstanceMethod(self):
print 'output from an instance method'
@classmethod
def myStaticMethod(cls):
print 'output from a static method'
>>> MyClass.myInstanceMethod()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unbound method myInstanceMethod() must be called [...]
>>> MyClass.myStaticMethod()
output from a static method
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:
>>> MyClass.myInstanceMethod(MyClass())
egy példánymódszer kimenete