Er statiske klassevariabler mulige i Python?

Er det muligt at have statiske klassevariabler eller metoder i Python? Hvilken syntaks er nødvendig for at gøre dette?

Løsning

Variabler, der er deklareret i klassedefinitionen, men ikke i en metode, er klasse- eller statiske variabler:

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

Som @millerdev påpeger, skaber dette en i-variabel på klasseniveau, men dette er forskelligt fra enhver i-variabel på instansniveau, så du kunne have

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

Dette er forskelligt fra C++ og Java, men ikke så forskelligt fra C#, hvor et statisk medlem ikke kan tilgås ved hjælp af en reference til en instans.

Se hvad Python-tutorials har at sige om klasser og klasseobjekter.

@Steve Johnson har allerede svaret vedrørende statiske metoder, som også er dokumenteret under "Built-in Functions" i Python Library Reference.

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

@beidy anbefaler classmethods frem for staticmethod, da metoden så modtager klassetypen som det første argument, men jeg er stadig lidt usikker på fordelene ved denne fremgangsmåde frem for staticmethod. Hvis du også er det, så er det nok ligegyldigt.

Kommentarer (10)

Personligt ville jeg bruge en classmethod, når jeg havde brug for en statisk metode. Hovedsageligt fordi jeg får klassen som et argument.

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

eller bruge en decorator

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

For statiske egenskaber.. Det er på tide at du slår op nogle python definition... variabel kan altid ændre sig. Der er to typer af dem mutable og immutable.. Der er også klasseattributter og instansattributter... Der er ikke rigtig noget der ligner statiske attributter i den forstand som i java & c++

Hvorfor bruge statiske metoder i pythisk forstand, hvis de ikke har nogen som helst relation til klassen? Hvis jeg var dig, ville jeg enten bruge classmethod eller definere metoden uafhængigt af klassen.

Kommentarer (2)

Statiske metoder i python kaldes classmethods. Tag et kig på følgende kode

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

Bemærk, at når vi kalder metoden myInstanceMethod, får vi en fejl. Det skyldes, at det kræver, at metoden skal kaldes på en instans af denne klasse. Metoden myStaticMethod er indstillet som en classmethod ved hjælp af decorator @classmethod.

Bare for sjov og ballade kunne vi kalde myInstanceMethod på klassen ved at overgive en instans af klassen på denne måde:

>>>> MyClass.myInstanceMethod(MyClass())
output fra en instansmetode
Kommentarer (1)