起步
当需要 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 是真值 
还不快抢沙发