Разница между наличием @staticmethod и его отсутствием - PullRequest
1 голос
/ 21 марта 2019

В Python 3.x, что я могу сделать с bar(), что я не могу сделать с foo()?

class A:
    def foo():
        print("some code")

    @staticmethod
    def bar():
        print("some code")

Примечание: я изначально забыл указать self в качестве аргументана foo(), но я оставляю здесь ошибку, поскольку ответы на нее и устраняют.

Ответы [ 2 ]

3 голосов
/ 21 марта 2019

a staticmethod - это метод, для которого в качестве первого параметра не требуется объект. Это означает, что это метод, полезный для самого класса и всех его экземпляров, а не просто его экземпляров (объект инициализирован как A().

Что это означает на практике, так это то, что Python неявно отправляет сам объект в качестве параметра. Ваш первый метод сломается, как только вы его назовете:

>>> a.foo()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: foo() takes 0 positional arguments but 1 was given

Это потому, что Python предоставляет методы объекта с самим объектом в качестве первого параметра. Отсюда и повсеместный аргумент о себе:

def foo(self): #Proper signature

С другой стороны,

A.bar()

будет работать просто отлично, и так будет

a.bar()

Объект не указан в качестве первого аргумента. Используйте staticmethod s для методов, которые должны быть полезны для класса и его экземпляров, но не требуют знания ни того, ни другого. Обычно я использую их как служебные функции.

Обратите внимание, что существует третья версия , classmethod, которая похожа на обычный метод в том, что она принимает первый параметр по умолчанию - класс вызывающей стороны. В этом случае минимальная подпись

@classmethod
def operateOnClass(cls):

Используйте это для внесения изменений, которые влияют на все экземпляры, например, для изменения переменных класса.

3 голосов
/ 21 марта 2019

bar() может быть вызвано из необоснованного объекта класса. foo() необходимо указать self в качестве аргумента, и поэтому его можно вызывать только из объекта, уже объявленного как экземпляр class A

...