Python 中的非空字符串应该有一个真值。为什么如果我显式调用该__bool__()函数,我会收到错误消息?如果我使用一个if语句,它似乎会进行评估。
>>> myvar = 'test'
>>> myvar.__bool__()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute '__bool__'
>>> if myvar:
... print("myvar TRUTHY")
...
myvar TRUTHY
>>>
Run Code Online (Sandbox Code Playgroud)
字符串没有__bool__()方法(这是错误告诉你的)。相反,__len__()如果字符串不为零,python 将调用该字符串并返回 True。正如python数据模型所提到的:
如果未定义此方法,
__len__()则调用(如果已定义),并且如果其结果非零,则认为该对象为真。如果一个类既不定义__len__()也不定义__bool__(),则它的所有实例都被认为是真的。
您可以通过创建UserString(or str)的子类并注意何时__len__()调用来验证这一点。当您在布尔上下文中使用字符串时,它将被调用:
from collections import UserString
class myString(UserString):
def __len__(self):
print("length called")
return super().__len__()
s = myString("hello")
if s:
pass
# prints "length called"
bool(s)
# length called
# True
Run Code Online (Sandbox Code Playgroud)