È possibile avere variabili o metodi statici di classe in Python? Quale sintassi è necessaria per farlo?
Le variabili dichiarate all'interno della definizione della classe, ma non in un metodo, sono variabili di classe o statiche:
>>> class MyClass:
... i = 3
...
>>> MyClass.i
3
Come fa notare @millerdev, questo crea una variabile i
a livello di classe, ma questa è distinta da qualsiasi variabile i
a livello di istanza, quindi si potrebbe avere
>>> m = MyClass()
>>> m.i = 4
>>> MyClass.i, m.i
>>> (3, 4)
Questo è diverso da C++ e Java, ma non così diverso da C#, dove un membro statico non può essere raggiunto usando un riferimento ad un'istanza.
Vedere cosa dice il tutorial di Python sull'argomento classi e oggetti di classe.
@Steve Johnson ha già risposto riguardo ai metodi statici, documentati anche sotto "Built-in Functions" nella Python Library Reference.
class C:
@staticmethod
def f(arg1, arg2, ...): ...
@beidy raccomanda classmethods rispetto a staticmethod, in quanto il metodo riceve il tipo di classe come primo argomento, ma sono ancora un po' confuso sui vantaggi di questo approccio rispetto a staticmethod. Se lo siete anche voi, allora probabilmente non ha importanza.
Personalmente userei un classmethod ogni volta che ho bisogno di un metodo statico. Soprattutto perché ottengo la classe come argomento.
class myObj(object):
def myMethod(cls)
...
myMethod = classmethod(myMethod)
o usare un decoratore
class myObj(object):
@classmethod
def myMethod(cls)
Per le proprietà statiche... È il momento di dare un'occhiata a qualche definizione di python... la variabile può sempre cambiare. Ci sono due tipi di loro, mutabile e immutabile .. Inoltre, ci sono attributi di classe e attributi di istanza .. Niente di veramente simile agli attributi statici nel senso di java & c++
Perché usare un metodo statico in senso pitonico, se non ha alcuna relazione con la classe! Se fossi in te, userei classmethod o definirei il metodo indipendente dalla classe.
I metodi statici in python sono chiamati classmethod. Date un'occhiata al seguente codice
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
Notate che quando chiamiamo il metodo myInstanceMethod, otteniamo un errore. Questo perché richiede che il metodo sia chiamato su un'istanza di questa classe. Il metodo myStaticMethod è impostato come un classmethod usando il decorator @classmethod.
Tanto per fare due chiacchiere, potremmo chiamare myInstanceMethod sulla classe passando un'istanza della classe, così:
pre>>>> MyClass.myInstanceMethod(MyClass())
output di un metodo di istanza
pre>