Python类中的属性初始化/声明:放置它们的位置?

for*_*ran 44 python attributes coding-style

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

class A(object):
    foo = None
Run Code Online (Sandbox Code Playgroud)

VS

class A(object):
   def __init__(self):
       self.foo = None
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 55

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

class A(object):
    foo = None
Run Code Online (Sandbox Code Playgroud)

这将导致('foo',None)是一个(key,value)在一对A.__dict__.

如果要基于每个实例自定义属性,请使用实例属性:

class A(object):
   def __init__(self):
       self.foo = None
Run Code Online (Sandbox Code Playgroud)

这将导致('foo',None)是一个(key,value)在一对a.__dict__其中a=A()是的一个实例A.

  • Python有一组复杂的[属性查找规则](http://www.cafepy.com/article/python_attributes_and_methods/python_attributes_and_methods.html).在没有进入描述符的情况下,对于这种情况,首先要知道`a .__ dict__`首先搜索`foo`键,如果在那里找不到,那么搜索`A .__ dict__`就足够了.这就是为什么即使`foo`是一个类属性你也可以使用`a.foo`. (7认同)
  • 同样值得注意的是,对于类的属性,如果你是做`a.foo = whatever`,你实际上最终创建一个新的实例属性(隐藏类属性).`A.foo`将保持不变.它有点像一个问题,因为你可以使用`a.foo`访问`A.foo`的值,但是分配给它会创建一个新的实例属性. (3认同)