Възможни ли са статични променливи на класове в Python?

Възможно ли е в Python да има статични променливи или методи на класа? Какъв синтаксис е необходим за това?

Решение

Променливите, декларирани в дефиницията на класа, но не и в метод, са променливи на класа или статични променливи:

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

Както посочва @millerdev, това създава променлива i на ниво клас, но тя се различава от всяка променлива i на ниво инстанция, така че бихте могли да имате

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

Това е различно от C++ и Java, но не е толкова различно от C#, където статичен член не може да бъде достъпен чрез препратка към инстанция.

Вижте какво се казва в учебника по Python по темата за класовете и обектите от класове.

@Стив Джонсън вече е отговорил относно статичните методи, документирани също в "Вградени функции" в справочника на библиотеката Python.

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

@beidy препоръчва classmethods пред staticmethod, тъй като тогава методът получава типа на класа като първи аргумент, но аз все още съм малко размит относно предимствата на този подход пред staticmethod. Ако и вие сте така, тогава вероятно това няма значение.

Коментари (10)

Лично аз бих използвал classmethod винаги, когато ми е необходим статичен метод. Главно защото получавам класа като аргумент.

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

или използвайте декоратор

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

За статични свойства.. Време е да разгледате някоя дефиниция на Python.. променливата винаги може да се промени. Има два вида променливи - променливи и непроменливи.. Освен това има атрибути на класове и атрибути на инстанции. Нищо подобно на статичните атрибути в смисъла на java & c++

Защо да използваме статичен метод в питонския смисъл, ако той няма никаква връзка с класа! На ваше място бих използвал classmethod или бих дефинирал метода независимо от класа.

Коментари (2)

Статичните методи в питон се наричат classmethods. Разгледайте следния код

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

Забележете, че когато извикаме метода myInstanceMethod, получаваме грешка. Това е така, защото се изисква методът да бъде извикан върху инстанция на този клас. Методът myStaticMethod е зададен като метод на класа с помощта на декоратора @classmethod.

Само за радост можем да извикаме myInstanceMethod на класа, като подадем инстанция на класа, както следва:

>>> MyClass.myInstanceMethod(MyClass())
изход от метод на инстанция
Коментари (1)