2013-04-13 56 views
1

作爲每this articlePython對象屬性檢索機構

當訪問objectname.attributename,以下對象中搜索順序爲屬性:

1. 對象本身(objectname.__dict__或任何對象名的Python提供的屬性)。

2. 該對象的類型(objectname.__class__.__dict__)。注意只搜索__dict__,這意味着只有用戶提供的類的屬性。換句話說,即使objectname.__class__.__bases__確實存在,objectname.__bases__也不會返回任何內容。

3. 對象類的基礎,它們的基礎等等。 (objectname.__class__.__bases__各自的__dict__)。不止一個基地不會混淆Python,現在不應該關注我們。需要注意的是,搜索所有鹼基,直到找到屬性。

爲了測試我建立這個例子

class Superb(object): 
    svar=1 

class Sub(Superb): 
    ... 

class Leaf(Sub): 
    def __init__(self): 
     print(Leaf.svar) 

lobj=Leaf() 

實例創建工作和印刷Leaf.svar的值(如1)理論。 這意味着,在解析Leaf.svar時,Python查看了葉子對象的基地的基礎,這在本文中未提及。按照該文章,對象的(即類型)的基礎被搜索。我懷疑文章作者犯了什麼錯誤,這當然是我理解中的一個空白。有人可以澄清。

+0

「對象的類的基礎,**它們的基**等等」 –

+0

對象的(葉)類的基礎是'類型'它的基礎是'對象' - >這個搜索不走通子(葉鹼)和卓越(子鹼)的路徑 –

+0

沒有葉子的'bases'是'(子,')。嘗試'打印(Leaf .__基地__)'。你是怎麼得到'type'的? –

回答

0

我不知道這是否是公平的回答你自己的問題,但也有一些進一步的閱讀中,我明白,當對象是「階級」再有就是在規則稍作修改。因此,在class.attribute的情況下,還會搜索類的基礎(以及類的類,即類型)。

class.attribute兩種因此,應該在

對象屬性(即類定義)對象的

庫(類名。__ 鹼基 __等)

被搜索對象的類型(類的情況下,「類型」)

基地對象的類的(即OBJE ct)

+1

這是公平的答案(有時如果沒有人認真研究它,有時是必要的),但是,你沒有得到它的聲譽。參見[禮儀回答自己的問題在梅塔(http://meta.stackexchange.com/questions/17845/etiquette-for-answering-your-own-question)。 – gaige

3

該文章掩蓋了一些細節。當你有這樣的問題,現在是時候把權威人士透露,在這種情況下是Python語言參考,部分3.2. The standard type hierarchy,其中包含類條目其中規定(我的重點):

類有一個由字典對象實現的名稱空間。類屬性引用被翻譯爲本字典中的查找,例如,C.x被翻譯爲C.__dict__["x"](儘管對於新式類,特別是有許多鉤子允許其他方式來定位屬性)。 當在那裏未找到屬性名稱時,屬性搜索繼續在基類中。

這是描述屬性查找類,而不是類實例,我相信它解釋了你的代碼中發生了什麼。

爲了完整起見,這裏就是下一個條目,約類實例,說:

一個類的實例有一個用字典是在哪個屬性引用搜索的第一個地方實現的名字空間。如果在那裏找不到屬性,並且實例的類具有該名稱的屬性,則繼續搜索類屬性。

我把「繼續搜索類屬性」定義爲「重複給出類的過程」,即搜索基類。如果沒有,繼承就會不那麼有用!

您鏈接到文章解釋屬性查找的類的實例,但它並沒有說明屬性查找的類的任何信息。因爲它沒有,它給人的印象是它的工作原理是一樣的,但事實並非如此。

+1

湯姆謝謝你看這個問題,可能是我正在閱讀(理解錯誤),但這是文章中的意思。 Object(本例中的Leaf)的基礎是'type',它的基礎是'object',它沒有任何其他的基類。在這種情況下,超級對象不是對象類的基礎或對象類的基礎基礎,它是對象本身的基礎的基礎。 –

+0

@AccEnq:你是對的。我實際上誤解了你的問題,並且認爲你正在談論類實例中的屬性查找。這是我的粗心 - 我的道歉。我已經重寫了這個答案,以引用Python語言參考,這解釋了這一點。 –

+0

不夠感謝你。 –