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

时间:2015-04-21 22:05:32

标签: python design-patterns coding-style

我习惯在该类的构造函数中初始化类实例的属性,但是,如果属性对类很紧,我也声明它们并将它们初始化为None[]或其他一些基础值)作为类中的属性。

例如:

 class AClass(object):
      aprop = None

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

在大多数情况下,它不会与以下方面产生很大的不同:

 class AClass(object):

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

但是,如果某人获得AClass的范围,则会注意到此类的实例应具有名为aprop的属性。我认为它是该类中属性aprop的占位符。

这更像是一种风格问题,但我想知道这是否是一种好习惯。你会推荐吗?这是常见的吗?或者我应该试着摆脱它?

2 个答案:

答案 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}的实例上,就不需要将它作为类成员方法。

我的投票是总是写出清楚传达意图所需的最少量的代码。在类中添加一个额外的成员会模糊意图(因为你的实际目标是使它成为一个实例属性)并且是不必要的:这听起来像两次攻击它。