Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类变量的行为类似于实例变量(Python 3.4)_Python_Python 3.x_Instance Variables_Class Variables - Fatal编程技术网

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

类变量的行为类似于实例变量(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

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
>>> 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'}