2017-02-09 28 views
0

documentation明確指出爲什麼Python的布爾內建只看類級別__bool__方法

如果沒有定義這個方法__bool____len__()被調用時,如果它被定義,如果結果不爲零,則該對象被視爲真。如果類別既不定義__len__()也不定義__bool__(),它的所有實例都被認爲是真實的。

粗體是我的插入,斜體是我的,但文本實際上是在那裏。該類必須包含該方法的事實很容易通過

class A: 
    pass 

a = A() 
a.__bool__ = (lamda self: False).__get__(a, type(a)) 

print(bool(A()), bool(a)) 

結果是True True測試,如文檔的權利要求。重寫__len__產生同樣的結果:

b = A() 
b.__len__ = (lambda self: 0).__get__(b, type(b)) 

print(bool(A()), bool(b)) 

這個作品完全一樣的文檔聲稱它會的。但是,我發現背後的理由有點違反直覺。我知道內建的bool沒有看實例的方法,但我不明白爲什麼。知道內部運作的人是否知道爲什麼只有級別級別的__bool____len__方法會影響真實性,而忽略實例級方法?

回答

1

原因是how special methods are looked up

對於自定義類,特殊方法的隱式調用只有在對象類型上定義時才能保證正常工作,而不是在對象的實例字典中定義。

...

這種行爲背後的基本原理在於一些特殊的方法,如__hash__()__repr__()由所有對象,包括類型對象實現。如果這些方法的隱式查找使用傳統的查找過程,則在對類型對象本身調用時它們將失敗。

...

除了繞過任何情況下在正確的利益屬性,隱含的特殊方法查找通常也繞過即使對象的元類的__getattribute__()方法。

...

繞過以這種方式__getattribute__()機械提供顯著餘地解釋中速度的優化,以在特殊的方法處理一些靈活性爲代價的(特殊的方法必須是在類對象本身上設置,以便被解釋器一致地調用)。

相關問題