Python类未定义__bool__时,if obj语句调用哪个特殊方法?
问题解答
Python中if语句做真值判断的逻辑是按固定优先级执行的:
- 第一优先级:查找类是否定义了
__bool__方法,存在则直接调用,以方法返回值的布尔结果作为判断依据。 - 第二优先级:如果没有
__bool__方法,就查找类是否定义了__len__方法,存在则调用,方法返回0判定为假,返回非0值判定为真。 - 兜底规则:如果两个方法都没有定义,解释器不会调用任何实例方法做额外判断,默认将该类的实例判定为真值。
回到你给出的测试场景,你打印的dir(obj)结果里既没有__bool__也没有__len__,说明这个自定义类没有重写这两个和真值判断相关的方法,它继承的基类object本身也没有实现这两个方法。这种情况下if判断根本不会调用你列出的任何一个特殊方法,直接走兜底规则把obj判定为True,所以会输出Inside if。
你可以自己写代码验证这个逻辑:
- 给类加一个返回0的
__len__方法,不定义__bool__,if判断就会得到False结果:
class CustomObject: def __init__(self, value): self.value = value def __len__(self): return 0 obj = CustomObject(10) if obj: print("Inside if") # 这段代码不会执行
- 如果同时定义
__bool__和__len__,永远会优先调用__bool__,不会触发__len__的逻辑。
内容的提问来源于stack exchange,提问作者Pooya Mohammadi Kazaj
相关产品推荐
相关产品推荐

