的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__
方法會影響真實性,而忽略實例級方法?