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?

Megoldás

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.

Kommentárok (10)

É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.

Kommentárok (2)

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 "", line 1, in 
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
Kommentárok (1)