Vai Python ir iespējami statiskie klases mainīgie?

Vai Python ir iespējams izmantot statiskus klases mainīgos vai metodes? Kāda sintakse ir nepieciešama, lai to izdarītu?

Risinājums

Mainīgie, kas deklarēti klases definīcijā, bet ne metodē, ir klases vai statiskie mainīgie:

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

Kā norāda @millerdev, tas rada klases līmeņa i mainīgo, bet tas atšķiras no jebkura gadījuma līmeņa i mainīgā, tāpēc varētu būt

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

Tas atšķiras no C++ un Java, bet ne tik ļoti no C#, kur statiskajam loceklim nevar piekļūt, izmantojot atsauci uz instance.

Skatiet Python pamācību par klasēm un klases objektiem.

@Steve Johnson jau ir atbildējis par statiskajām metodēm, kas arī dokumentētas sadaļā "Iebūvētās funkcijas" Python bibliotēkas atsaucē.

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

@beidy iesaka classmethods, nevis staticmethod, jo tad metode kā pirmo argumentu saņem klases tipu, bet es joprojām esmu mazliet neskaidrs par šīs pieejas priekšrocībām salīdzinājumā ar staticmethod. Ja arī jums ir, tad, iespējams, tam nav nozīmes.

Komentāri (10)

Es personīgi izmantoju klases metodi, kad man bija nepieciešama statiska metode. Galvenokārt tāpēc, ka kā argumentu es saņemu klasi.

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

vai izmantot dekoratoru

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

Statiskām īpašībām.. Tās laiks jums apskatīt kādu python definīciju.. mainīgais vienmēr var mainīties. Ir divu veidu mainīgie un nemainīgie mainīgie.. Ir arī klases atribūti un instances atribūti... Nekas līdzīgs statiskajiem atribūtiem java un c++ izpratnē.

Kāpēc lietot statisko metodi pitoniskā nozīmē, ja tai nav nekādas saistības ar klasi! Ja es būtu jūsu vietā, es vai nu izmantotu klases metodi, vai definētu metodi neatkarīgi no klases.

Komentāri (2)

Statiskās metodes pitonā sauc par classmethods. Aplūkojiet šādu kodu

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

Ievērojiet, ka, izsaucot metodi myInstanceMethod, mēs saņemam kļūdu. Tas ir tāpēc, ka šī metode ir jāizsauc šīs klases instancē. Metode myStaticMethod ir iestatīta kā klases metode, izmantojot dekoratoru @classmethod.

Tikai tā, ka mēs varētu izsaukt myInstanceMethod klasei, nododot klases gadījumu, piemēram, šādi:

>>>> MyClass.myInstanceMethod(MyClass())
izvads no gadījuma metodes
Komentāri (1)