复合赋值给Python类和实例变量

int*_*nt3 5 python class

我一直在努力理解Python对类和实例变量的处理.特别是,我发现这个答案很有帮助.基本上它说如果你声明一个类变量,然后你做一个赋值[instance].property,你将完全分配一个不同的变量 - 一个与类变量不同的命名空间.

所以我考虑过 - 如果我希望我的类的每个实例都有一个默认值(比如零)的成员,我应该这样做:

class Foo:
    num = 0
Run Code Online (Sandbox Code Playgroud)

或者像这样?

class Foo:
    def __init__(self):
        self.num = 0
Run Code Online (Sandbox Code Playgroud)

基于我之前读过的内容,我认为第二个例子是初始化'right'变量(实例而不是类变量).但是,我发现第一种方法也非常有效:

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?
Run Code Online (Sandbox Code Playgroud)

那么..为什么这个有效?我得不到什么?FWIW,我之前对OOP的理解来自C++,因此通过类比(或指向它发生故障)的解释可能是有用的.

Mat*_*ttH 5

就个人而言,我发现Shalabh Chaturvedi 撰写的这些文件对于这个主题非常有用且内容丰富.

bar.num += 1是一个简写bar.num = bar.num + 1.这是Foo.num在右侧拾取类变量并将其分配给实例变量bar.num.