有时候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
..
那么,在zen of Python中声明显式优于隐式时,我们怎么不这样编程呢?有什么东西我不见了吗?
答案 0 :(得分:7)
稍后在Python中添加了类方法支持,并且已经建立了将self
用于实例的约定。保持该惯例稳定比切换到更长名称instance
更有价值。
类方法的约定是使用名称cls
:
class A:
@classmethod
def do(cls):
换句话说,约定已经存在来区分类对象和实例;永远不要将self
用于类方法。
另见PEP 8 - Function and method arguments:
始终使用
self
作为实例方法的第一个参数。始终使用
cls
作为类方法的第一个参数。
答案 1 :(得分:3)
我认为使用“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
答案 2 :(得分:1)
我认为重点是,您不会将self
用于包含@classmethod
的方法。 (你可以写kls
,cls
等等。)
如果你愿意的话,最终没有什么能阻止你写inst
代替self
。因此,您的第二个示例将正常工作,实际上是处理它的预期方式(在区分实例与类之间)。但是,在处理实例时,绝对应该使用self
。它是一个Python惯例,强烈建议不要破坏它。
正如其他人已经提到过的那样,它的真正PEP8确实表示在实例和类方法的情况下分别使用self
和cls
。我唯一要补充的是,虽然没有任何明智的理由可以违反这条规则,但更改self
会更加严重(来自语义POV)因为它在99.999%的Python代码。它的使用是如此通用,许多(如果不是大多数)初学者认为它是一个关键词,并且被人们将自己改变为任何事物的想法感到困惑。
与IMO的类方法相比,这种与代码和约定的强烈关系并不那么明显。当然我会敦促任何人尽可能多地关注PEP8,但是如果你觉得倾向于使用kls
而不是cls
,我觉得你犯的是比你更小的邪恶已更改self
。但是,中的任何名称在整个程序中保持一致。