python 理解类变量与实例变量
2016-04-10 本文已影响2284人
FaiChou
实例的属性存储在实例的dict中。
类属性和方法存储在类的dict中。
查找属性的顺序:特性->实例的dict->类的dict->基类。
如果都不存在就会抛出异常。
class aa:
w = 10
def __init__(self):
self.x = 11
self.y = 12
def add(self):
return self.x + self.y
a = aa()
print a.add()
aa.w = 20
a.w = 13
print aa.w, a.w
a.t = 14
a.q = 15
print a.t, a.q
aa.m = 30
aa.n = 40
print aa.m, aa.n
b = aa()
print b.x, b.y
print b.t, b.q
print b.m, b.n
#输出
23
20 13
14 15
30 40
11 12
Traceback (most recent call last):
File "100tests.py", line 508, in <module>
print b.t,b.q
AttributeError: aa instance has no attribute 't'
>>> class aa():
... w = 10
...
>>> print aa.__dict__
{'__module__': '__main__', '__doc__': None, 'w': 10}
>>> a = aa() # 建立实例a
>>> a.w = 13 # 为实例a添加属性
>>> aa.__dict__
{'__module__': '__main__', '__doc__': None, 'w': 10}
>>> #实例a的属性并未添加到类属性中
...
>>> aa.m = 30 # 添加类属性m
>>> aa.n = 40 # 添加类属性n
>>> aa.__dict__
{'__module__': '__main__', 'm': 30, '__doc__': None, 'w': 10, 'n': 40}
>>> # m, n 已添加到类字典中,此时b = aa() 建立新实例b, 当查找b.m时首先查找实例b的字典b.__dict__,其中不含m属性,因此向上查找b所属的类aa的属性m=30
...
>>> # 而查找b.x时,实例b的字典和类aa的字典中都无x属性,因此抛出异常
...
>>>
试下以下代码会有更好地理解
class foo():
w = 10
f = foo()
f.w = 20
print f.w # 结果为20
del f.w
print f.w # 结果为10
在 Python 中没有常量。如果你试图努力的话什么都可以改变。这一点满足 Python 的核心原则之一:坏的行为应该被克服而不是被取缔。如果你真正想改变 None的值,也可以做到,但当无法调试的时候别来找我。