起步
当需要 if obj
或者not obj
判断一个实例对象的真假时,Python 解释器会优先调用魔法方法 __bool__()
。如果没有该方法,就调用 __len__()
。如果两个方法都没有,总是返回 True。
bool
class MyClass():
def __bool__(self):
return False
if __name__ == "__main__":
obj = MyClass()
res = "obj 是真值" if obj else "obj 不是真值"
print(res)
# 输出:
obj 不是真值
__bool__()
方法仅支持返回布尔值。当返回 False 时,not obj
为真;当返回 True 时,not obj
为假。
len
class MyClass():
def __len__(self):
return 0
if __name__ == "__main__":
obj = MyClass()
res = "obj 是真值" if obj else "obj 不是真值"
print(res)
# 输出:
obj 不是真值
一般来说,__len__()
这个魔法函数是在使用len()
的时候调用,其目的是:获取对象的长度。然而,如果实例对象没有__bool__()
,Python 解释器就会找到 __len__()
。如果 __len__()
返回值大于 0,认为是真值,如果 __len__()
返回值等于 0,认为是假值。__len__()
仅支持返回 >=0 的整数。019.10.5 事实上,不仅支持 >= 0 的整数,还可以返回 True(代表 1) 和 False(代表 0)。
bool 与 len
前面已经说过,Python 解释器会优先找 __bool__()
,所以如果 __bool__()
和 __len__()
同时存在,也就没 __len__()
的事儿了。可如果两个魔法方法都没有,实例对象总是真值。
class MyClass():
pass
if __name__ == "__main__":
obj = MyClass()
res = "obj 是真值" if obj else "obj 不是真值"
print(res)
# 输出:
obj 是真值
还不快抢沙发