我习惯在该类的构造函数中初始化类实例的属性,但是,如果属性对类很紧,我也声明它们并将它们初始化为None
( []
或其他一些基础值)作为类中的属性。
例如:
class AClass(object):
aprop = None
def __init__(self):
self.aprop = "avalue"
在大多数情况下,它不会与以下方面产生很大的不同:
class AClass(object):
def __init__(self):
self.aprop = "avalue"
但是,如果某人获得AClass
的范围,则会注意到此类的实例应具有名为aprop
的属性。我认为它是该类中属性aprop
的占位符。
这更像是一种风格问题,但我想知道这是否是一种好习惯。你会推荐吗?这是常见的吗?或者我应该试着摆脱它?
答案 0 :(得分:3)
当您在self.aprop = "avalue"
函数中执行__init__
时,AClass
的每个实例都将具有aprop
属性,因为启动实例时会调用__init__
。这使aprop
成为实例变量。
当您执行aprop = None
时,您将类变量添加到AClass
。这意味着类本身将具有此属性。
例如:
>>> 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
因此,如果您希望您的类具有此属性,则应将其定义为类变量。如果您只在实例中使用它,那么您应该定义类属性的唯一情况是,如果您不总是在__init__
中重新定义它(隐藏它):
class AClass(object):
aprop = None
def __init__(self):
self.bprop = "bvalue"
答案 1 :(得分:1)
除非你曾经访问类本身的属性(例如AClass.aprop
)而不是实例,否则如果你总是将它填充在{{1}的实例上,就不需要将它作为类成员方法。
我的投票是总是写出清楚传达意图所需的最少量的代码。在类中添加一个额外的成员会模糊意图(因为你的实际目标是使它成为一个实例属性)并且是不必要的:这听起来像两次攻击它。