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
總體上,先檢查對象的數據描述符,然后檢查實例字典,在檢查類和基類的非數據描述符,最后是類字典和基類的字典。
新聞熱點
疑難解答