该文件明确指出
当此方法(
__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__
方法会影响真实性而忽略实例级别的方法?