Er statiske klassevariabler mulig i Python?

Er det mulig å ha statiske klassevariabler eller metoder i Python? Hvilken syntaks kreves for å gjøre dette?

Løsning

Variabler som er deklarert inne i klassedefinisjonen, men ikke inne i en metode, er klassevariabler eller statiske variabler:

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

Som @millerdev påpeker, oppretter dette en i-variabel på klassenivå, men dette er forskjellig fra en hvilken som helst i-variabel på instansnivå, så du kan ha

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

Dette er forskjellig fra C++ og Java, men ikke så forskjellig fra C#, der et statisk medlem ikke kan nås ved hjelp av en referanse til en forekomst.

Se hva Python-opplæringen har å si om klasser og klasseobjekter.

@Steve Johnson har allerede svart angående statiske metoder, også dokumentert under "Innebygde funksjoner" i Python Library Reference.

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

@beidy anbefaler classmethods over staticmethod, da metoden deretter mottar klassetypen som første argument, men jeg er fortsatt litt uklar på fordelene med denne tilnærmingen i forhold til staticmethod. Hvis du også er det, så spiller det sannsynligvis ingen rolle.

Kommentarer (10)

Personlig ville jeg bruke en classmethod når jeg trengte en statisk metode. Hovedsakelig fordi jeg får klassen som et argument.

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

eller bruke en dekoratør

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

For statiske egenskaper .. Det er på tide at du slår opp noen python-definisjoner ... variabler kan alltid endres. Det er to typer av dem foranderlige og uforanderlige... Det er også klasseattributter og forekomstattributter ... Ingenting virkelig som statiske attributter i betydningen java og c ++ ...

Hvorfor bruke statisk metode i pytonisk forstand, hvis den ikke har noen som helst relasjon til klassen! Hvis jeg var deg, ville jeg enten brukt classmethod eller definert metoden uavhengig av klassen.

Kommentarer (2)

Statiske metoder i python kalles classmethods. Ta en titt 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

Legg merke til at når vi kaller metoden myInstanceMethod, får vi en feil. Dette er fordi den krever at metoden kalles på en instans av denne klassen. Metoden myStaticMethod er satt som en classmethod ved hjelp av decorator @classmethod.

Bare for moro skyld kan vi kalle myInstanceMethod på klassen ved å sende inn en instans av klassen, slik:

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