有时self可以表示类的实例,有时表示类本身。那么,为什么我们不使用inst和klass而不是self呢?那不是让事情更简单了吗?
事情现在是怎样的
class A:
@classmethod
def do(self): # self refers to class
..
class B:
def do(self): # self refers to instance of class
..我觉得他们应该是
class A:
@classmethod
def do(klass): # no ambiguity
..
class B:
def do(inst): # no ambiguity
..那么,为什么我们不像这样编程呢?在Python的禅宗中,有人说显式比隐式好?我遗漏了什么吗?
发布于 2015-02-20 10:32:48
类方法支持后来添加到Python中,并且已经建立了对实例使用self的约定。保持该约定的稳定比切换到更长的名称(如instance )更有价值。
类方法的约定是使用名称cls
class A:
@classmethod
def do(cls):换句话说,约定已经存在以区分类对象和实例;永远不要对类方法使用self。
还请参见佩普8-
始终对实例方法的第一个参数使用
self。 始终在类方法的第一个参数中使用cls。
发布于 2015-02-20 10:32:00
我认为最好使用"cls":
class A:
@classmethod
def do(cls): # cls refers to class
..
class B:
def do(self): # self refers to instance of class
..这是PEP8的要求:
http://legacy.python.org/dev/peps/pep-0008/#function-and-method-arguments
发布于 2015-02-20 10:33:30
我认为问题是,按照惯例,对于用self包装的方法,不使用@classmethod。(您可以编写kls、cls等)
如果您愿意的话,最终没有什么能阻止您编写inst而不是self。因此,您的第二个示例工作得很好,并且实际上是处理它的预期方法(在区分实例与类方面)。但是,在处理实例时,绝对应该使用self。这是Python的惯例,破坏它是强烈的劝阻。
PEP8
正如其他人提到的那样,PEP8确实说在实例方法和类方法的情况下使用self和cls。我要补充的唯一一点是,虽然没有任何合理的理由打破这条规则,但是更改self要糟糕得多(从语义POV),因为它在99.999%的Python代码中得到了很强的使用。它的使用是如此的普遍,以至于许多初学者(如果不是大多数的话)都认为它是一个关键字,并且对一个人可以将自己变成任何东西的想法感到困惑。
这种与代码和惯例的密切关系在类方法( IMO )中并不那么明显。当然,我会敦促任何人尽可能多地遵循PEP8,但是如果您觉得倾向于使用kls而不是cls,我认为您所犯的恶行要比更改self要小。但是,无论您使用哪一个名称,在整个程序中都应该保持一致。
https://stackoverflow.com/questions/28626777
复制相似问题