类变量的行为类似于实例变量 (Python 3.4)

Sha*_*man 2 python instance-variables class-variables python-3.x

Python 3.4.0a1
视窗 8.1

创建的类:

class Bank(object):  
    bankrupt = False  
Run Code Online (Sandbox Code Playgroud)

命令在 IDLE 中输入,__main__结果如下:

>>> a = Bank()
>>> b = Bank()
>>> a.bankrupt
False
>>> b.bankrupt
False
>>> b.bankrupt = True
>>> b.bankrupt
True
>>> a.bankrupt
False
Run Code Online (Sandbox Code Playgroud)

预期输出:

当我更改 b.bankrupt 时,我预计 a.bankrupt 会更改为 True,因为变量 bankrupt 是为整个类定义的,而不是为单个实例定义的(带有self.bankrupt) 为什么这没有发生?

Mar*_*ers 6

您改为为实例分配了一个新属性。要更改类属性,请直接分配给该类。

在实例上查找属性时,查找“落入”到类,然后到基类。这就是所有类属性(包括方法)的查找方式。

但是在分配时,这直接发生在实例上。否则你永远不能分配每个实例的值,你只能分配回类。分配给a.bankruptb.bankrupt将向实例添加一个属性,如果它开始时还没有。对于 Python 而言,self.bankrupt = True在方法中使用或a.bankrupt = True从“外部”使用来分配给属性没有区别。

只需直接分配给类属性(从方法或从“外部”):

Bank.bankrupt = True
Run Code Online (Sandbox Code Playgroud)

请注意,相同的读取失败、写入分配规则适用于基类;如果直接在类上找不到该属性,则在类上查找属性会查找基类,但在类上设置属性会直接这样做,并且不会影响基类上的属性。

有关详细信息,请参阅Python 数据模型自定义类类实例部分。