我一直在试图理解Python对类和实例变量的处理。特别是,我发现this answer相当有帮助。基本上它说,如果你声明一个类变量,然后你做了一个分配到[instance].property
,你将分配给一个不同的变量 - 一个在不同的名字空间的类变量。对Python类和实例变量的复合赋值
于是我认为 - 如果我想我的类的每个实例有一些默认值的成员(说零),我应该做这样的:
class Foo:
num = 0
或这样吗?
class Foo:
def __init__(self):
self.num = 0
基于我早一点看,我认为第二个例子是初始化“正确”的变量(实例,而不是类变量)。但是,我发现第一种方法也可以很好地工作:
class Foo:
num = 0
bar = Foo()
bar.num += 1 # good, no error here, meaning that bar has an attribute 'num'
bar.num
>>> 1
Foo.num
>>> 0 # yet the class variable is not modified! so what 'num' did I add to just now?
那么......为什么这样工作?我没有得到什么? FWIW,我之前对OOP的理解来自C++,所以用类比的方式来解释(或者指出它的分解点)可能是有用的。
而当我说类/实例'变量'我真正的意思是'属性'。 – MattH 2010-03-11 11:56:12