【发布时间】: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
我想知道在 Python 中、在类的主体中或在 __init__ 函数内部初始化对象属性的最佳做法是什么?
即
class A(object):
foo = None
对
class A(object):
def __init__(self):
self.foo = None
【问题讨论】:
标签: python coding-style attributes
如果你希望类的所有实例共享该属性,请使用类属性:
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 的一个实例。
【讨论】:
a.__dict__ 首先搜索foo 键就足够了,如果在那里找不到,则搜索A.__dict__。这就是为什么即使foo 是类属性,您也可以使用a.foo。
a.foo = whatever,你实际上最终会创建一个新的实例属性(它隐藏了类属性)。 A.foo 将保持不变。这有点棘手,因为您可以使用 a.foo 访问 A.foo 的值,但分配给它会创建一个新的实例属性。
类定义中定义的属性被认为是类变量(就像Java中的静态变量),而那些在初始化程序中设置的属性是实例属性(注意self.something = 1和something = 1之间的区别)。请参阅this question 了解更多详情,this one 了解更多信息。这两种情况之间没有太大的实际区别,因为类级别的定义为属性提供了一个默认值,但是如果你想在使用对象实例之前使用某种逻辑来设置属性,你应该在__init__() 方法。
【讨论】: