类变量的行为类似于实例变量(Python 3.4)
Python 3.4.0a1类变量的行为类似于实例变量(Python 3.4),python,python-3.x,instance-variables,class-variables,Python,Python 3.x,Instance Variables,Class Variables,Python 3.4.0a1 Windows 8.1 创建的类: class Bank(object): bankrupt = False 在IDLE\uuuu main\uuuu中输入的命令,结果如下: >>> a = Bank() >>> b = Bank() >>> a.bankrupt False >>> b.bankrupt False >>> b.bankrupt = True
Windows 8.1 创建的类:
class Bank(object):
bankrupt = False
在IDLE\uuuu main\uuuu
中输入的命令,结果如下:
>>> a = Bank()
>>> b = Bank()
>>> a.bankrupt
False
>>> b.bankrupt
False
>>> b.bankrupt = True
>>> b.bankrupt
True
>>> a.bankrupt
False
预期产出:
当我更改b.breaken时,我希望a.breaken会更改为True,因为变量breaken是为整个类定义的,而不是为单个实例定义的(使用
self.breaken
),为什么不会发生这种情况?使用b.breaken=True
可以创建一个隐藏类级别变量的实例变量
如果要更改类变量,请使用
Bank.bankrupt = True
而是将新属性指定给实例。要更改类属性,请直接指定给该类 在实例上查找属性时,查找“通过”类,然后是基类。这就是所有类属性(包括方法)的查找方式 但在分配时,这直接发生在实例上。否则,您永远无法分配每个实例的值,而只能将其分配回类。分配给
a.breaker
或b.breaker
将为实例添加一个属性,如果该实例还没有开始的话。对于Python来说,在方法中使用self.breaken=True
,或者从“外部”使用a.breaken=True
来分配属性之间没有区别
只需直接(从方法或“外部”)分配给class属性:
注意,同样的读时失败,写时赋值规则也适用于基类;如果在类上未直接找到属性,则在类上查找属性会查找基类,但在类上设置属性会直接查找基类,而不会影响基类上的属性
有关详细信息,请参阅自定义类和类实例部分。在赋值给实例变量后,如果该变量不是在之前创建的,则创建该变量。下次您尝试访问它时,您可以从实例
\uuuu dict\uuuu
获得它
>>> 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'}
在这种情况下,没有创建实例变量。因此,从建模的角度来看,现在既有一个
b
的实例变量,也有一个名为破产的类变量,单个银行
实例不应该单独破产吗?请注意,当您在类上使用\uuuuuuuu插槽
时,使用的是编号\uuuuuu dict\uuuuu
。
>>> a.bar.append(1)
>>> b.bar
[1]
>>> a.bar
[1]
>>> a.__dict__
{'foo': 'c'}