Python 判断实例对象真与假

Python 小记 2019-05-17 1254 字 1308 浏览 点赞

起步

当需要 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 是真值


本文由 Guan 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论