【问题标题】:Initialize object properties as class properties first in Python在 Python 中首先将对象属性初始化为类属性
【发布时间】:2015-04-21 22:05:31
【问题描述】:

我有在类的构造函数中初始化类实例的属性的习惯,但是,如果属性对类非常紧,我也会声明它们并将它们初始化为None(@987654322 @ 或其他一些基值)作为类中的属性。

例如:

 class AClass(object):
      aprop = None

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

在大多数情况下,这与仅仅做没有太大区别:

 class AClass(object):

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

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

在我看来,这更像是一个风格问题,但我想知道这是否是一个好习惯。你会推荐它吗?是不是很常见?还是我应该尝试摆脱它?

【问题讨论】:

    标签: python design-patterns coding-style


    【解决方案1】:

    当您在__init__ 函数中执行self.aprop = "avalue" 时,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"
    

    【讨论】:

      【解决方案2】:

      除非您访问类本身的属性(例如AClass.aprop)而不是实例上的属性,否则如果您始终在__init__ 方法中的实例上填充它,则无需将其设为类成员。

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

      【讨论】:

        猜你喜欢
        • 2017-09-29
        • 1970-01-01
        • 2013-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-12
        相关资源
        最近更新 更多