нормальный метод
Когда вызывается метод объекта, ему автоматически присваивается дополнительный аргумент 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)