有一個代碼:class C(): a=1 def f(self): print "f func"a=C()print a.aa.f()>>> 1>>> f func當我試圖獲得a.__dict__或時vars(a),它告訴我公正{}。但a.b=123print a.__dict__>>> {'b': 123}我不明白,為什么會這樣。
2 回答

手掌心
TA貢獻1942條經(jīng)驗 獲得超3個贊
查看a.__dict__
或vars(a)
為您提供屬性a
,它是一個實例。該實例最初沒有自己的屬性。屬性a
您在類定義創(chuàng)建的類本身的屬性不是它的實例。稍后,當您a.b = 123
在實例上創(chuàng)建一個屬性時,便可以在實例中看到它__dict__
。a
如果您查看,就會看到該屬性C.__dict__
。
當您這樣做時print a.a
,Python會a
在類上動態(tài)查找屬性C
。它看到實例沒有屬性a
,因此它在類上查找并在那里找到一個。那就是打印的值。創(chuàng)建實例時,class屬性不會“復(fù)制”到實例。相反,每次您嘗試讀取實例屬性時,Python都會檢查該實例屬性是否存在,如果不存在,則會在類中進行查找。

弒天下
TA貢獻1818條經(jīng)驗 獲得超8個贊
>>> C.a
1
>>> vars(C)['a']
1
(vars一堂課的整個字典相當長。)
就像您的標題說的那樣,它是一個類變量。它屬于類,而不是對象。Python在幕后做一些特殊的邏輯,以便在調(diào)用時為您查找類型對象a.a。我不是專家,但我懷疑它正在尋找a與找到方法相同的方法。我相信在Java之類的語言中,不建議使用這種用法。我不知道它是否不建議在Python中使用。
添加回答
舉報
0/150
提交
取消