Python inst/klass 而不是自己?

Python inst/klass instead of self?

有时 self 可以表示 class 的实例,有时可以表示 class 本身。那么,为什么我们不使用 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 中声明 显式优于隐式 时,我们为什么不这样编程呢?有什么我想念的吗?

我觉得用"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

Class 方法支持很晚才添加到 Python,并且已经建立了对实例使用 self 的约定。保持该约定稳定比切换到更长的名称(如 instance.

更有价值

class 方法的约定是使用名称 cls:

class A:
    @classmethod
    def do(cls):

换句话说,约定已经存在以区分class对象和实例;永远不要将 self 用于 class 方法。

另见 PEP 8 - Function and method arguments:

Always use self for the first argument to instance methods.

Always use cls for the first argument to class methods.

我认为重点是您通常不会对用 @classmethod 包装的方法使用 self。 (你可以写 klscls 等)

如果您愿意,没有什么能阻止您写 inst 而不是 self。因此,您的第二个示例可以正常工作,并且实际上是处理它的预期方式(在区分实例与 class 方面)。但是,在处理实例时绝对应该使用 self。这是一个 Python 约定,强烈建议不要打破它。

PEP8

正如其他人提到的那样,PEP8 确实说在实例和 class 方法的情况下分别使用 selfcls。我要补充的唯一一件事是,虽然没有任何合理的理由打破这个规则,但改变 self 明显更糟(从语义 POV 来看),因为它在 99.999% 的 Python代码。它的用途是如此 普遍 以至于许多(如果不是大多数)初学者都认为它是一个关键字,并且对可以 将 self 更改为任何东西的想法感到困惑 .

这种与代码和约定的密切关系在 class 方法 IMO 中并不那么明显。当然我会敦促任何人尽可能多地遵循 PEP8,但是如果你倾向于使用 kls 而不是 cls,我觉得你会犯下比你改变 kls 更小的罪恶。 =10=]。但是,无论您使用哪个名称 都应该 在整个程序中保持一致。