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

时间:2014-06-30 07:22:36

标签: python python-3.x instance-variables class-variables

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)为什么这不会发生?

3 个答案:

答案 0 :(得分:4)

您已为实例分配了新属性。要更改类属性,请直接指定给类。

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

但是当分配时,这会直接在实例上发生。否则你永远不能分配每个实例的值,你只需要分配给类。分配给a.bankruptb.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.foob.foo的值不同的原因 同时如果您修改变量(不重新分配),您将得到您所描述的结果。

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

在这种情况下,未创建实例变量。