Why some class variables seem to act as static while others don't?
直接在类定义下定义的字典和列表是静态的(例如,这个问题)其他变量,比如整数,为什么不呢?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | >>> class Foo(): bar=1 >>> a=Foo() >>> b=Foo() >>> a.bar=4 >>> b.bar 1 >>> class Foo(): bar={} >>> a=Foo() >>> b=Foo() >>> a.bar[7]=8 >>> b.bar {7: 8} |
它们都是类变量。除了在指定
1 | instance -> class -> parent classes in MRO order (left to right) |
如果你有
1 2 | class Foo(object): bar = 1 |
这是类foo上的变量。一旦你做了
1 2 | a = Foo() a.bar = 2 |
您已经在对象
您创建的dict在类级别,因此它在该类的所有实例之间共享。
当你完成任务时
1 | >>> a.bar=4 |
您正在将
1 | >>> a.bar[7]=8 |
不会将cx1〔0〕重新绑定到任何不同的地方,只需修改名称所引用的字典。
如果你这样做了
1 | >>> a.bar = {7: 8} |
然后您将重新绑定到新字典中。
假设
a.bar = 4 创建了一个实例属性bar ,它在a 的上下文中隐藏了类bar 。a.bar[4] = 2 只修改类级bar 绑定到的对象(假设它支持索引)a.bar += 1 —这一个很讨厌。如果类级bar 支持+= 操作(例如通过实现__iadd__() 来实现),则会就地修改,不会创建对象级属性。否则,它相当于a.bar = a.bar + 1 ,并创建一个新的实例属性bar 。