python 理解類變量與實例變量

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容