正如标题所描述的那样,我作为例子感到困惑:
class Point(object):
def __init__(self, x=0.0, y=0.0):
self.x, self.y = x, y
@classmethod
def get_point1(cls, cor): # cor is list with x=1 and y=2
return Point(cor[0], cor[1])
@classmethod
def get_point2(cls, cor):
return cls(cor[0], cor[1])
我很困惑应该使用哪一个(get_point1
或get_point2
),它们之间有什么区别?
答案 0 :(得分:1)
@classmethod装饰器使函数成为类方法,而不是实例方法。为了使其更健壮,最好使用cls
而不是定义它的实际类名。
如果使用 cls ,则在使用 Point 明确时,将传递的参数取决于被调用的实际类(例如,如果您是Point的子类),可以如果你继承它并使用类方法会导致问题。
请查看此代码
class Point(object):
def __init__(self, x=0.0, y=0.0):
self.x, self.y = x, y
@classmethod
def get_point1(cls, cor): # cor is list like [1,2] with x=1 and y=2
return Point(cor[0], cor[1])
@classmethod
def get_point2(cls, cor):
return cls(cor[0], cor[1])
class SubPoint(Point):
pass
sub1 = SubPoint.get_point1([0, 1])
sub2 = SubPoint.get_point2([2, 2])
print sub1.__class__
print sub2.__class__
<class '__main__.Point'>
<class '__main__.SubPoint'>
还有其他区别吗? - 好吧,如果你需要在你的类方法中做一些逻辑,这取决于类的属性,那么肯定是。