【问题标题】:Attributes initialization/declaration in Python class: where to place them?Python 类中的属性初始化/声明:将它们放在哪里?
【发布时间】:2011-10-18 15:01:54
【问题描述】:

我想知道在 Python 中、在类的主体中或在 __init__ 函数内部初始化对象属性的最佳做法是什么?

class A(object):
    foo = None

class A(object):
   def __init__(self):
       self.foo = None

【问题讨论】:

    标签: python coding-style attributes


    【解决方案1】:

    如果你希望类的所有实例共享该属性,请使用类属性:

    class A(object):
        foo = None
    

    这会导致('foo',None) 成为A.__dict__ 中的(key,value) 对。

    如果您希望在每个实例的基础上自定义属性,请使用实例属性:

    class A(object):
       def __init__(self):
           self.foo = None
    

    这会导致('foo',None) 成为a.__dict__ 中的(key,value) 对,其中a=A()A 的一个实例。

    【讨论】:

    • 有道理,我认为在这两种情况下它们都绑定到实例......谢谢:)
    • Python 有一组复杂的attribute lookup rules。在不涉及描述符的情况下,对于这种情况,知道a.__dict__ 首先搜索foo 键就足够了,如果在那里找不到,则搜索A.__dict__。这就是为什么即使foo 是类属性,您也可以使用a.foo
    • 另外值得注意的是,对于类属性,如果你要做a.foo = whatever,你实际上最终会创建一个新的实例属性(它隐藏了类属性)。 A.foo 将保持不变。这有点棘手,因为您可以使用 a.foo 访问 A.foo 的值,但分配给它会创建一个新的实例属性。
    【解决方案2】:

    类定义中定义的属性被认为是类变量(就像Java中的静态变量),而那些在初始化程序中设置的属性是实例属性(注意self.something = 1something = 1之间的区别)。请参阅this question 了解更多详情,this one 了解更多信息。这两种情况之间没有太大的实际区别,因为类级别的定义为属性提供了一个默认值,但是如果你想在使用对象实例之前使用某种逻辑来设置属性,你应该在__init__() 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-29
      • 2017-02-26
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 2012-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多