實例的屬性存儲在實例的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的值,也可以做到,但當無法調試的時候別來找我。