class Test(object):
i = 0
def add(self):
Test.i += 1
print "Test.i == ",Test.i
print "'i' in dir(Test) == ",'i' in dir(Test)
print "'i' in Test.__dict__ == ",'i' in Test.__dict__
t1 = Test()
print '\n# t1 = Test() executed'
print "t1.i == ",t1.i
print "'i' in dir(t1) == ",'i' in dir(t1)
print "'i' in t1.__dict__ == ",'i' in t1.__dict__
結果
Test.i == 0
'i' in dir(Test) == True
'i' in Test.__dict__ == True
# t1 = Test() executed
t1.i == 0
'i' in dir(t1) == True
'i' in t1.__dict__ == False
。
對象的名稱__dict__
的屬性是表示該對象的命名空間的字典,也就是說它所包含的對象的屬性。
同時,我們有:
目錄([對象])
如果對象有一個名爲__dir__()
方法,這個方法會被稱爲 並且必須返回屬性的列表。
那麼,怎麼可能是dir(t1)
包含屬性我和t1.__dict__
不? 儘管所有兩個dir(Test)
和Test.__dict__
都包含屬性i?
。
這是爲回答您的問題同樣的原因:
返回一個對象的屬性的行爲是尷尬。
而`dir(object)
反映了這種尷尬:
默認目錄()機制與不同類型的對象 不同的行爲,因爲它試圖產生最相關的,而不是 完整,信息:
•如果對象是模塊對象,則該列表將包含模塊屬性的名稱 。
•如果對象是類型或類對象,則 列表將包含其屬性的名稱,並遞歸地包含其基礎的 屬性。
•否則,列表中包含對象的 屬性名稱中,其類的屬性的名字,和 遞歸的它的類的基類的屬性。
。
然後,回答你的問題有兩個部分:
1)dir(t1)
給出什麼被視爲對象,但對象的真實名稱空間的屬性,暴露t1.__dict__
不包含屬性這是因爲它已經被回答了,實際上是一個班級的屬性。
因此,僞屬性兩個實例T1和T2的我出現等於因爲表達t1.i
和t2.i
實際上評爲Test.i
,
以同樣的方式,dir(t1)
和dir(t2)
包括類的屬性Test.i
。
2)如何將表達式t1.i
評估爲Test.i
?
正因爲如此(這構成了我的答案的其他信息):
一個類的實例有一個用字典是 在屬性引用首位被搜索實現的名字空間。當在那裏找不到 屬性,並且該實例的類具有該名稱的 屬性時,搜索將繼續使用類 屬性。
http://docs.python.org/reference/datamodel.html#the-standard-type-hierarchy
這意味着,當一個對象的命名空間中找不到一個屬性,就搜索,其對象是實例的類的命名空間。
這是一個*類變量*,正如你正確地說自己 - 它屬於類,而不是這個類的特定實例。 – Niko 2013-03-17 22:12:26
請注意我的回答 – eyquem 2013-03-17 23:01:56