Vai Python ir iespējams izmantot statiskus klases mainīgos vai metodes? Kāda sintakse ir nepieciešama, lai to izdarītu?
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.
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.
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 "<stdin>", line 1, in <module>
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