python屬性查詢

2022-07-04 01:30:17 字數 734 閱讀 7684

python中執行obj.attr時,將呼叫特殊方法obj.__getattribute__('attr'),該方法執行搜尋來查詢該屬性,通常涉及檢查特性、查詢例項字典、查詢類字典以及搜尋基類。如果搜尋過程失敗,最終會嘗試呼叫類的__getattr__()方法。如果這也失敗,則丟擲attributeerror異常。

具體步驟如下:

1.如果attr是個特殊屬性(例如python提供的),直接返回。

2.在obj.__class__.__dict__即類字典中查詢attr,如果attr是個data描述符,則返回資料描述符的__get__方法結果。如果沒有,則繼續在obj.__class__的基類中尋找data描述符。注意要確定為data描述符,只實現了__get__方法的non-data描述符優先順序是在後面的。

3.在obj.__dict__即例項字典中查詢,找到就直接返回。如果是obj是乙個類,依次在obj和它的基類的__dict__中查詢,如果找到乙個descriptor就返回descriptor的__get__方法的結果,否則直接返回attr。如果沒有找到,進行下一步。

4.在obj.__class__.__dict__即類字典中查詢,如果找到了乙個non-data描述符,則返回描述符的__get__方法的結果。如果找到乙個普通屬性,直接返回屬性值。在obj基類中執行同樣的查詢。

5.raise attributeerror

總體上,先檢查物件的資料描述符,然後檢查例項字典,在檢查類和基類的非資料描述符,最後是類字典和基類的字典。

Python物件屬性的查詢順序

1 查詢順序 1 類和父類字典的資料描述器 2 例項字典 3 類和父類字典中的非資料描述器 無論類有多少個繼承級別,該類物件的例項字典總是儲存了所有的例項變數,這也是 super 的意義之一。2 例項 def get attribute obj,name class definition obj.c...

52 屬性查詢

優先順序 先從物件的字典裡找,沒有,再去類的字典中找 class student school oldboy def init obj,x,y,z obj.name x obj.age y obj.gender z defchoose self print s 正在選課 self.name stu ...

python屬性 python抽象屬性 不屬性

如果你真的要強制乙個子類定義乙個給定的屬性,你可以使用元類.就個人而言,我認為這可能是過度的,而不是非常pythonic,但你可以做這樣的事情 class abstractfoometa type def call cls,args,kwargs called when you call foo a...