Zijn statische klassevariabelen mogelijk in Python?

Is het mogelijk om statische klassevariabelen of -methoden te hebben in Python? Welke syntaxis is nodig om dit te doen?

Oplossing

Variabelen die in de definitie van de klasse worden gedeclareerd, maar niet in een methode, zijn klasse- of statische variabelen:

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

Zoals @millerdev opmerkt, creëert dit een i variabele op klassenniveau, maar dit is verschillend van een i variabele op instantie-niveau, dus je zou

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

Dit is anders dan in C++ en Java, maar niet zo anders dan in C#, waar een static member niet kan worden benaderd met een verwijzing naar een instantie.

Zie wat de Python-tutorial te zeggen heeft over het onderwerp klassen en klasse-objecten.

@Steve Johnson heeft al geantwoord met betrekking tot static methods, ook gedocumenteerd onder "Built-in Functions" in the Python Library Reference.

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

@beidy beveelt classmethods aan boven staticmethod, omdat de methode dan het klassetype als eerste argument krijgt, maar ik'ben nog een beetje vaag over de voordelen van deze aanpak boven staticmethod. Als jij dat ook bent, dan maakt het waarschijnlijk'niet uit.

Commentaren (10)

Persoonlijk zou ik een klassemethode gebruiken wanneer ik een statische methode nodig heb. Voornamelijk omdat ik de klasse als argument krijg.

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

of gebruik een decorator

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

Voor statische eigenschappen.. Het wordt tijd dat je wat python definities opzoekt... Variabele kunnen altijd veranderen. Er zijn twee soorten: veranderlijk en onveranderlijk. Ook zijn er klasse attributen en instantie attributen... Niets echt zoals statische attributen in de zin van java & c++

Waarom static method gebruiken in pythonische zin, als het geen enkele relatie heeft met de klasse! Als ik jou was, zou ik ofwel classmethod gebruiken of de methode onafhankelijk van de klasse definiëren.

Commentaren (2)

Statische methodes in python worden klassemethodes genoemd. Kijk eens naar de volgende code

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

Merk op dat wanneer we de methode myInstanceMethod aanroepen, we een foutmelding krijgen. Dit komt omdat de methode moet worden aangeroepen op een instantie van deze klasse. De methode myStaticMethod is ingesteld als een klassemethode met behulp van de decorator @klassemethode.

Voor de grap zouden we myInstanceMethod op de klasse kunnen aanroepen door een instantie van de klasse door te geven, zoals dit:

>>> MyClass.myInstanceMethod(MyClass())
uitvoer van een instantie-methode
Commentaren (1)