在 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 添加一个额外的成员会掩盖意图(因为您在这里的实际目标是让它成为一个实例 属性)并且是不必要的:这听起来像是对它的两次罢工。
我习惯在 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 添加一个额外的成员会掩盖意图(因为您在这里的实际目标是让它成为一个实例 属性)并且是不必要的:这听起来像是对它的两次罢工。