В чем разница между @staticmethod и @classmethod? - PullRequest
3121 голосов
/ 26 сентября 2008

В чем разница между функцией, отмеченной @staticmethod, и функцией, отмеченной @classmethod?

Ответы [ 23 ]

1 голос
/ 01 декабря 2017

Методы класса, как следует из названия, используются для внесения изменений в классы, а не в объекты. Чтобы внести изменения в классы, они изменят атрибуты класса (не атрибуты объекта), поскольку именно так вы обновляете классы. Это причина того, что методы класса принимают класс (условно обозначаемый как «cls») в качестве первого аргумента.

class A(object):
    m=54

    @classmethod
    def class_method(cls):
        print "m is %d" % cls.m

Статические методы, с другой стороны, используются для выполнения функций, которые не связаны с классом, то есть они не будут читать или записывать переменные класса. Следовательно, статические методы не принимают классы в качестве аргументов. Они используются для того, чтобы классы могли выполнять функции, которые не имеют прямого отношения к назначению класса.

class X(object):
    m=54 #will not be referenced

    @staticmethod
    def static_method():
        print "Referencing/calling a variable or function outside this class. E.g. Some global variable/function."
0 голосов
/ 21 мая 2019

нормальный метод

Когда вызывается метод объекта, ему автоматически присваивается дополнительный аргумент self в качестве первого аргумента. То есть метод

def f(self, x, y)

должен вызываться с 2 аргументами. self автоматически передается, и это сам объект .

метод класса

Когда метод оформлен

@classmethod
def f(cls, x, y)

автоматически предоставленный аргумент - это не self, а класс self.

статический метод

Когда метод оформлен

@staticmethod
def f(x, y)

метод не получает никакого автоматического аргумента вообще. Он задается только параметрами, с которыми он вызывается.

обыкновений

  • classmethod в основном используется для альтернативных конструкторов.
  • staticmethod не использует состояние объекта. Это может быть функция, внешняя по отношению к классу. Он помещает внутрь класса только для группировки функций с аналогичными функциями (например, как статические методы класса Java Math)
class Point
    def __init__(self, x, y):
        self.x = x
        self.y = y

    @classmethod
    def frompolar(cls, radius, angle):
        """The `cls` argument is the `Point` class itself"""
        return cls(radius * cos(angle), radius * sin(angle))

    @staticmethod
    def angle(x, y):
        return atan(y, x)


p1 = Point(3, 2)
p2 = Point.frompolar(3, pi/4)

angle = Point.angle(3, 2)

0 голосов
/ 17 декабря 2012

Быстрый взлом других идентичных методов в iPython показывает, что @staticmethod дает незначительный прирост производительности (в наносекундах), но в остальном он, похоже, не работает. Кроме того, любое повышение производительности, вероятно, будет устранено дополнительной работой по обработке метода с помощью staticmethod() во время компиляции (что происходит до выполнения любого кода при запуске сценария).

Ради читабельности кода я бы избегал @staticmethod, если только ваш метод не будет использоваться для нагрузок, когда количество наносекунд считается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...