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.bankrupt时,a.bankrupt会更改为True,因为为整个类定义了变量破产而不是单个实例(使用self.bankrupt
)为什么这不会发生?
答案 0 :(得分:4)
您已为实例分配了新属性。要更改类属性,请直接指定给类。
在实例上查找属性时,查找“通过”到类,然后到基类。这就是找到所有类属性(包括方法)的方法。
但是当分配时,这会直接在实例上发生。否则你永远不能分配每个实例的值,你只需要分配给类。分配给a.bankrupt
或b.bankrupt
会为实例添加一个属性(如果尚未开始)。对于Python,在方法中使用self.bankrupt = True
或从“外部”使用a.bankrupt = True
来分配属性没有区别。
直接分配给class属性(来自方法或来自'outside'):
Bank.bankrupt = True
请注意,读取时相同,写入规则的赋值适用于基类;如果在类上没有直接找到属性,则查找类的属性会查找基类,但是在类上设置属性会直接执行,而不会影响基础上的属性。
有关详细信息,请参阅Python datamodel的自定义类和类实例部分。
答案 1 :(得分:0)
使用b.bankrupt = True
创建一个隐藏类级变量的实例变量。
如果要更改类变量,请使用
Bank.bankrupt = True
答案 2 :(得分:0)
在分配给实例变量之后,如果不是之前,则创建它。下次尝试访问它时,您可以从实例__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'}
在这种情况下,未创建实例变量。