Czy możliwe jest posiadanie statycznych zmiennych klasowych lub metod w Pythonie? Jaka składnia jest wymagana, aby to zrobić?
Zmienne zadeklarowane wewnątrz definicji klasy, ale nie wewnątrz metody są zmiennymi klasowymi lub statycznymi:
>>> class MyClass:
... i = 3
...
>>> MyClass.i
3
Jak wskazuje @millerdev, tworzy to zmienną i
na poziomie klasy, ale jest ona różna od jakiejkolwiek zmiennej i
na poziomie instancji, więc mógłbyś mieć
>>> m = MyClass()
>>> m.i = 4
>>> MyClass.i, m.i
>>> (3, 4)
To różni się od C++ i Javy, ale nie różni się tak bardzo od C#, gdzie statyczny członek nie może'być dostępny przy użyciu odniesienia do instancji.
Zobacz co samouczek Pythona ma do powiedzenia na temat klas i obiektów klas.
@Steve Johnson odpowiedział już na temat metod statycznych, również udokumentowanych pod "Built-in Functions" w Python Library Reference.
class C:
@staticmethod
def f(arg1, arg2, ...): ...
@beidy poleca classmethods nad staticmethod, ponieważ metoda otrzymuje wtedy typ klasy jako pierwszy argument, ale ja'jestem wciąż trochę rozmyty co do zalet tego podejścia nad staticmethod. Jeśli ty też jesteś, to prawdopodobnie nie ma to znaczenia.
Osobiście użyłbym metody klasowej za każdym razem, gdy potrzebowałbym metody statycznej. Głównie dlatego, że dostaję klasę jako argument.
class myObj(object):
def myMethod(cls)
...
myMethod = classmethod(myMethod)
lub użyć dekoratora
class myObj(object):
@classmethod
def myMethod(cls)
Dla statycznych właściwości.. Jego czas spojrzeć w górę trochę definicji pythona... zmienna zawsze może się zmienić. Istnieją dwa ich rodzaje mutable i immutable... Istnieją również atrybuty klasy i atrybuty instancji... Nic tak naprawdę nie przypomina statycznych atrybutów w sensie java & c++.
Po co używać statycznej metody w sensie pythonicznym, jeśli nie ma ona żadnego związku z klasą! Gdybym był tobą, I'd albo użyć classmethod lub zdefiniować metodę niezależną od klasy.
Metody statyczne w pythonie nazywane są classmethods. Spójrz na następujący kod
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
Zauważ, że kiedy wywołujemy metodę myInstanceMethod, otrzymujemy błąd. Dzieje się tak dlatego, że wymaga ona, aby metoda została wywołana na instancji tej klasy. Metoda myStaticMethod jest ustawiona jako classmethod za pomocą dekoratora @classmethod.
Dla żartów i zabawy, moglibyśmy wywołać myInstanceMethod na klasie, przekazując jej instancję, jak poniżej:
>>> MyClass.myInstanceMethod(MyClass())
wyjście z metody instancji