python 內置方法

1.__getattr__:訪問不存在的成員python

2.__getattribute__:訪問成員的時候默認調用該函數,而通常不會調用__getattr__,只有出現異常,纔會轉到__getattr__處理。若是要重寫該函數,不要使用return self.__dict__[name] ,會形成死循環ssh

3.__setattr__:將等式右邊的值賦予左邊的成員,調用該方法。函數

4.__get__:描述符必選,(描述符,存在類的__dict__中的屬性)若是類的屬性有__get__方法,則該屬性的值爲__get__返回值;def __get__(self, instance, owner),t.d,,T.d,都調用__get__(self, instance, owner),前者intance爲t,owner爲T,後者instance爲None,owner爲Tspa

5.__set__:描述符可選,t.d = value,實際上調用d.__set__(t, value),T.d = value,這是真正的賦值,T.d的值今後變成value。d再也不是描述符,而是value;若是描述符沒有__set__函數,則賦值也是直接賦值。code

6.__delete__:描述符可選,與設置相似ip

7.__getitem__:能夠像list同樣使用下標取得元素get

8.abc模塊:提供抽象類,設定那些類函數必須實現,也能夠經過 __subclasshook__方法來實現虛擬方法的檢查it

 

  

備註:class

python屬性查找策略循環

1.若是attr是一個Python自動產生的屬性,找到!(優先級很是高!)

2.查找obj.__class__.__dict__,若是attr存在而且是data descriptor,返回data descriptor的__get__方法的結果,若是沒有繼續在obj.__class__的父類以及祖先類中尋找data descriptor

3.在obj.__dict__中查找,這一步分兩種狀況,第一種狀況是obj是一個普通實例,找到就直接返回,找不到進行下一步。第二種狀況是obj是 一個類,依次在obj和它的父類、祖先類的__dict__中查找,若是找到一個descriptor就返回descriptor的__get__方法的 結果,不然直接返回attr。若是沒有找到,進行下一步。

4.在obj.__class__.__dict__中查找,若是找到了一個descriptor(插一句:這裏的descriptor必定是non- data descriptor,若是它是data descriptor,第二步就找到它了)descriptor的__get__方法的結果。若是找到一個普通屬性,直接返回屬性值。若是沒找到,進行下 一步。

5.很不幸,Python終於受不了。在這一步,它raise AttributeError

 

對屬性賦值時的查找策略 ,對於obj.attr = value

1.查找obj.__class__.__dict__,若是attr存在而且是一個data descriptor,調用attr的__set__方法,結束。若是不存在,會繼續到obj.__class__的父類和祖先類中查找,找到 data descriptor則調用其__set__方法。沒找到則進入下一步。

2.直接在obj.__dict__中加入obj.__dict__['attr'] = value

相關文章
相關標籤/搜索