在 Python 中首先将对象属性初始化为 class 属性

Initialize object properties as class properties first in Python

我习惯在 class 的构造函数中初始化 class 实例的属性,但是,如果属性与 class 非常紧密,我还声明它们并将它们初始化为 None[] 或其他一些基值)作为 class.

中的属性

例如:

 class AClass(object):
      aprop = None

      def __init__(self):
           self.aprop = "avalue"

在大多数情况下,这与仅执行以下操作不会有太大区别:

 class AClass(object):

      def __init__(self):
           self.aprop = "avalue"

但是,如果有人获得 AClass 的范围,则会注意到此 class 的实例应具有名为 aprop 的属性。我认为它是 class.

中 属性 aprop 的占位符

在我看来,这更像是一个风格问题,但我想知道这是否是一种好的做法。你会推荐它吗?有什么共同点吗?还是我应该尝试摆脱它?

当您在 __init__ 函数中执行 self.aprop = "avalue" 时,AClass 的每个实例都将具有 aprop 属性,因为 __init__ 是启动实例时调用。这使得 aprop 成为 实例变量 .

当您执行 aprop = None 时,您将 class 变量 添加到 AClass。这意味着 class 本身将具有此 属性.

例如:

>>> class AClass(object):
...       def __init__(self):
...            self.aprop = "avalue"
...
>>> AClass.aprop
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'AClass' has no attribute 'aprop'

并且:

>>> class AClass(object):
...       aprop = None
...       def __init__(self):
...            self.aprop = "avalue"
...
>>> AClass.aprop
>>> print AClass.aprop
None

因此,如果您希望 class 拥有此 属性,则应将其定义为 class 变量。如果你只在实例中使用它,你应该定义一个 class 属性 的唯一情况是你不总是在 __init__:

中重新定义它(隐藏它)
class AClass(object):
      aprop = None
      def __init__(self):
           self.bprop = "bvalue"

除非您曾经在 class 本身(例如 AClass.aprop)而不是实例上访问 属性,否则没有必要将其设为 class成员,如果你总是在 __init__ 方法中的一个实例上填充它。

我的投票是始终编写最少的必要代码来清楚地传达意图。向 class 添加一个额外的成员会掩盖意图(因为您在这里的实际目标是让它成为一个实例 属性)并且是不必要的:这听起来像是对它的两次罢工。