Чи можливі статичні змінні класу в 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 на тему класів та об'єктів класів.

@Steve Johnson вже відповів стосовно статичних методів, що також задокументовано в розділі "Вбудовані функції" в Довіднику бібліотеки Python.

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

@beidy рекомендує classmethod замість staticmethod, оскільки метод отримує тип класу як перший аргумент, але я все ще не зовсім розумію переваги цього підходу над staticmethod. Якщо ви теж, то це, мабуть, не має значення.

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

Особисто я використовував би метод класу, коли мені потрібен статичний метод. В основному тому, що я отримую клас в якості аргументу.

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

або використовуйте декоратор

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

Для статичних властивостей.. Настав час переглянути визначення змінних у python... Змінні завжди можуть змінюватися. Вони бувають двох типів: змінювані та незмінювані. Також є атрибути класу та атрибути екземпляру. Ніщо так не схоже на статичні атрибути в розумінні java та c++ як статичні атрибути.

Навіщо використовувати статичний метод в пітонічному розумінні, якщо він не має ніякого відношення до класу! На Вашому місці я б або використовував метод класу, або визначав метод незалежним від класу.

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

Статичні методи у мові python називаються 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)