Jsou v jazyce Python možné statické proměnné tříd?

Je možné mít v Pythonu statické proměnné nebo metody třídy? Jaká syntaxe je k tomu potřeba?

Řešení

Proměnné deklarované uvnitř definice třídy, ale ne uvnitř metody, jsou třídní nebo statické proměnné:

>>> class MyClass:
...     i = 3
...
>>> MyClass.i
3 

Jak upozorňuje @millerdev, vytváří se tím proměnná i na úrovni třídy, která se však liší od proměnné i na úrovni instance, takže byste mohli mít proměnnou

>>> m = MyClass()
>>> m.i = 4
>>> MyClass.i, m.i
>>> (3, 4)

Tím se liší od C++ a Javy, ale ne tolik od C#, kde ke statickému členu nelze'přistupovat pomocí reference na instanci.

Viz co říká výukový program Python na téma tříd a objektů tříd.

@Steve Johnson již odpověděl ohledně statických metod, které jsou také zdokumentovány v části "Vestavěné funkce" v odkazu na knihovnu Pythonu.

class C:
    @staticmethod
    def f(arg1, arg2, ...): ...

@beidy doporučuje classmethods místo staticmethod, protože metoda pak dostává typ třídy jako první argument, ale já'mám stále trochu nejasnosti ohledně výhod tohoto přístupu oproti staticmethod. Pokud vy také, pak je to asi jedno.

Komentáře (10)

Osobně bych použil classmethod vždy, když bych potřeboval statickou metodu. Hlavně proto, že jako argument dostanu třídu.

class myObj(object):
   def myMethod(cls)
     ...
   myMethod = classmethod(myMethod) 

nebo použít dekorátor

class myObj(object):
   @classmethod
   def myMethod(cls)

Pro statické vlastnosti.. Je čas, abyste se podívali na nějakou definici pythonu.. proměnná se může vždy změnit. Existují dva typy proměnných: mutabilní a neměnné.. Také existují atributy třídy a atributy instance... Nic podobného statickým atributům ve smyslu java & c++.

Proč používat statickou metodu v pythonovském smyslu, když nemá žádný vztah ke třídě! Být vámi, použil bych buď classmethod, nebo bych definoval metodu nezávislou na třídě.

Komentáře (2)

Statické metody se v jazyce python nazývají classmethod. Podívejte se na následující kód

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 "", line 1, in 
TypeError: unbound method myInstanceMethod() must be called [...]

>>> MyClass.myStaticMethod()
output from a static method

Všimněte si, že při volání metody myInstanceMethod dojde k chybě. Je to proto, že vyžaduje, aby tato metoda byla volána na instanci této třídy. Metoda myStaticMethod je nastavena jako metoda třídy pomocí dekorátoru @classmethod.

Jen tak pro zajímavost bychom mohli zavolat myInstanceMethod na třídě předáním instance třídy, například takto:

>>> MyClass.myInstanceMethod(MyClass())
výstup z instanční metody
Komentáře (1)