简介
一个比较简单粗暴的区分方式:要决定是使用@staticmethod还是@classmethod,你必须看看类方法内部。如果你的方法访问了类中的其他变量/方法,那么就使用@classmethod。另一方面,如果方法没有接触到类中的任何其他变量,那么就使用@staticmethod。
但是其设计有更深的逻辑联系:
- classmethod主要用于替代构造函数。
- staticmethod不使用对象的状态,甚至不使用类本身的结构。它可以是一个类外部的函数。它只放在类的内部,用于分组具有类似功能的函数(例如,像Java的数学类静态方法)
一个例子
以下将举一个例子(来自Stack Overflow, 个人认为比较好理解上述的内容)。
class Point
def __init__(self, x, y):
self.x = x
self.y = y
@classmethod
def frompolar(cls, radius, angle):
""" `cls` 声明`Point`类"""
return cls(radius * cos(angle), radius * sin(angle))
@staticmethod
def angle(x, y):
"""这个方法也可以写在类的外面, 由于逻辑的关系被写在这个里面, 便于区分"""
return atan(y, x)
p1 = Point(3, 2)
# 建立极坐标系, 返回一个point对象
p2 = Point.frompolar(3, pi/4)
# 此时即便不对该类进行实例化也可以计算角度
angle = Point.angle(3, 2) # 或者是 Point().angle(3, 2)