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.bankrupt
或b.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.foo
和b.foo
有不同的值同时,如果你修改变量(而不是重新赋值),你会得到你所描述的结果。
>>> a.bar.append(1)
>>> b.bar
[1]
>>> a.bar
[1]
>>> a.__dict__
{'foo': 'c'}
本例中没有创建实例变量