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



Python 3.4.0a1
Windows 8.1

类创建:

class Bank(object):  
    bankrupt = False  

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

>>> a = Bank()
>>> b = Bank()
>>> a.bankrupt
False
>>> b.bankrupt
False
>>> b.bankrupt = True
>>> b.bankrupt
True
>>> a.bankrupt
False

预期输出:

当我改变b.破产法时,我期望a.破产法改变为True,因为变量破产法是为整个类而不是单个实例(与self.bankrupt)定义的,为什么这不会发生?

您为实例分配了一个新属性。要改变一个类的属性,直接赋值给这个类。

在实例中查找属性时,先查找类,然后查找基类。这就是找到所有类属性(包括方法)的方法。

但是当分配时,这直接发生在实例上。否则,您永远无法分配每个实例的值,您只能分配回类。分配给a.bankruptb.bankrupt将为实例添加一个属性,如果它一开始就不存在的话。对于Python来说,在方法中使用self.bankrupt = True和在外部使用a.bankrupt = True来赋值属性是没有区别的。

直接赋值给class属性(从方法或从'outside'):

Bank.bankrupt = True

注意,同样的读时失败,写时赋值规则也适用于基类;在类中查找属性时,如果没有直接在类中找到该属性,则查找基类,但是在类中设置属性则直接查找基类,而不影响基类中的属性。

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

使用b.bankrupt = True,您创建了一个实例变量,该实例变量遮蔽了类级变量。

如果你想改变类变量,使用

Bank.bankrupt = True

在赋值给实例变量后,如果该实例变量之前没有创建,则创建该实例变量。下次你想访问它的时候你可以从实例__dict__中得到它。

>>> class A:
...     foo = 'b'
...     bar = []
... 
>>> a = A()
>>> b = A()
>>> a.__dict__
{}
>>> a.foo = 'c'
>>> a.foo
'c'
>>> a.__dict__
{'foo': 'c'}

这就是为什么a.foob.foo有不同的值同时,如果你修改变量(而不是重新赋值),你会得到你所描述的结果。

>>> a.bar.append(1)
>>> b.bar
[1]
>>> a.bar
[1]
>>> a.__dict__
{'foo': 'c'}

本例中没有创建实例变量

最新更新