Python inst/klass 而不是自己?
Python inst/klass instead of self?
有时 self 可以表示 class 的实例,有时可以表示 class 本身。那么,为什么我们不使用 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 中声明 显式优于隐式 时,我们为什么不这样编程呢?有什么我想念的吗?
我觉得用"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
。 (你可以写 kls
、cls
等)
如果您愿意,没有什么能阻止您写 inst
而不是 self
。因此,您的第二个示例可以正常工作,并且实际上是处理它的预期方式(在区分实例与 class 方面)。但是,在处理实例时绝对应该使用 self
。这是一个 Python 约定,强烈建议不要打破它。
PEP8
正如其他人提到的那样,PEP8 确实说在实例和 class 方法的情况下分别使用 self
和 cls
。我要补充的唯一一件事是,虽然没有任何合理的理由打破这个规则,但改变 self
明显更糟(从语义 POV 来看),因为它在 99.999% 的 Python代码。它的用途是如此 普遍 以至于许多(如果不是大多数)初学者都认为它是一个关键字,并且对可以 将 self 更改为任何东西的想法感到困惑 .
这种与代码和约定的密切关系在 class 方法 IMO 中并不那么明显。当然我会敦促任何人尽可能多地遵循 PEP8,但是如果你倾向于使用 kls
而不是 cls
,我觉得你会犯下比你改变 kls
更小的罪恶。 =10=]。但是,无论您使用哪个名称 都应该 在整个程序中保持一致。
有时 self 可以表示 class 的实例,有时可以表示 class 本身。那么,为什么我们不使用 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 中声明 显式优于隐式 时,我们为什么不这样编程呢?有什么我想念的吗?
我觉得用"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
。 (你可以写 kls
、cls
等)
如果您愿意,没有什么能阻止您写 inst
而不是 self
。因此,您的第二个示例可以正常工作,并且实际上是处理它的预期方式(在区分实例与 class 方面)。但是,在处理实例时绝对应该使用 self
。这是一个 Python 约定,强烈建议不要打破它。
PEP8
正如其他人提到的那样,PEP8 确实说在实例和 class 方法的情况下分别使用 self
和 cls
。我要补充的唯一一件事是,虽然没有任何合理的理由打破这个规则,但改变 self
明显更糟(从语义 POV 来看),因为它在 99.999% 的 Python代码。它的用途是如此 普遍 以至于许多(如果不是大多数)初学者都认为它是一个关键字,并且对可以 将 self 更改为任何东西的想法感到困惑 .
这种与代码和约定的密切关系在 class 方法 IMO 中并不那么明显。当然我会敦促任何人尽可能多地遵循 PEP8,但是如果你倾向于使用 kls
而不是 cls
,我觉得你会犯下比你改变 kls
更小的罪恶。 =10=]。但是,无论您使用哪个名称 都应该 在整个程序中保持一致。