我应该使用类名还是`cls` param来构造一个实例?

时间:2017-09-09 08:53:28

标签: python

正如标题所描述的那样,我作为例子感到困惑:

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_point1get_point2),它们之间有什么区别?

1 个答案:

答案 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'>

还有其他区别吗? - 好吧,如果你需要在你的类方法中做一些逻辑,这取决于类的属性,那么肯定是。