python中執(zhí)行obj.attr時(shí),將調(diào)用特殊方法obj.__getattribute__('attr'),該方法執(zhí)行搜索來(lái)查找該屬性,通常涉及檢查特性、查找實(shí)例字典、查找類字典以及搜索基類。如果搜索過(guò)程失敗,最終會(huì)嘗試調(diào)用類的__getattr__()方法。如果這也失敗,則拋出AttributeError異常。
具體步驟如下:
1.如果attr是個(gè)特殊屬性(例如python提供的),直接返回。
2.在obj.__class__.__dict__即類字典中查找attr,如果attr是個(gè)data描述符,則返回?cái)?shù)據(jù)描述符的__get__方法結(jié)果。如果沒(méi)有,則繼續(xù)在obj.__class__的基類中尋找data描述符。注意要確定為data描述符,只實(shí)現(xiàn)了__get__方法的non-data描述符優(yōu)先級(jí)是在后面的。
3.在obj.__dict__即實(shí)例字典中查找,找到就直接返回。如果是obj是一個(gè)類,依次在obj和它的基類的__dict__中查找,如果找到一個(gè)descriptor就返回descriptor的__get__方法的結(jié)果,否則直接返回attr。如果沒(méi)有找到,進(jìn)行下一步。
4.在obj.__class__.__dict__即類字典中查找,如果找到了一個(gè)non-data描述符,則返回描述符的__get__方法的結(jié)果。如果找到一個(gè)普通屬性,直接返回屬性值。在obj基類中執(zhí)行同樣的查找。
5.Raise AttributeError
總體上,先檢查對(duì)象的數(shù)據(jù)描述符,然后檢查實(shí)例字典,在檢查類和基類的非數(shù)據(jù)描述符,最后是類字典和基類的字典。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注