Python inst / klass而不是self?

时间:2015-02-20 10:30:39

标签: python class naming-conventions instance

有时候self可以表示类的实例,有时也可以表示类本身。那么为什么我们不使用instklass代替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中声明显式优于隐式时,我们怎么不这样编程呢?有什么东西我不见了吗?

3 个答案:

答案 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的方法。 (你可以写klscls等等。)

如果你愿意的话,最终没有什么能阻止你写inst代替self。因此,您的第二个示例将正常工作,实际上是处理它的预期方式(在区分实例与类之间)。但是,在处理实例时,绝对应该使用self。它是一个Python惯例,强烈建议不要破坏它。

PEP8

正如其他人已经提到过的那样,它的真正PEP8确实表示在实例和类方法的情况下分别使用selfcls。我唯一要补充的是,虽然没有任何明智的理由可以违反这条规则,但更改self会更加严重(来自语义POV)因为它在99.999%的Python代码。它的使用是如此通用,许多(如果不是大多数)初学者认为它是一个关键词,并且被人们将自己改变为任何事物的想法感到困惑。

与IMO的类方法相比,这种与代码和约定的强烈关系并不那么明显。当然我会敦促任何人尽可能多地关注PEP8,但是如果你觉得倾向于使用kls而不是cls,我觉得你犯的是比你更小的邪恶已更改self。但是,中的任何名称在整个程序中保持一致。