python - 具有显式调用的字符串的真值和假值
问题描述
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
>>>
解决方案
字符串没有__bool__()
方法(这是错误告诉你的)。相反,python 将调用__len__()
该字符串,如果它不为零,则返回 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
推荐阅读
- java - 多用户安全 Java Web 应用程序
- powershell - Add-Computer 和 NewName,执行顺序和跟踪?
- .net - LINQ 相关子查询
- c++ - 禁用直接创建,只允许通过 NEW 和智能指针创建
- angular - 使用 PrimeNG 数据表
- java - 子类也会继承其父类的超类吗?
- codenameone - 代号一个图像选择器给出了错误的路径
- reactjs - 没有从 stylelint / stylelint-config-styled-components 得到结果或错误
- javascript - .toggleClass 在函数内部不起作用
- python - 使用 matplotlib 的 set_array() 例程的准则是什么?