Python面向对象编程第14篇 特殊方法之__bool__

Posted 不剪发的Tony老师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python面向对象编程第14篇 特殊方法之__bool__相关的知识,希望对你有一定的参考价值。

本篇将会介绍如何利用 Python __bool__ 方法定义对象的布尔值。

__bool__ 方法简介

自定义类的对象存在一个相关的布尔值。默认情况下该布尔值为 True。例如:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age


if __name__ == '__main__':
    person = Person('John', 25)
    print(bool(person))  # False

在上面的示例中,我们定义了 Person 类,初始化了一个对象,然后打印该对象的布尔值。

如果想要覆盖这种默认行为,我们可以实现 __bool__ 方法。该方法必须返回一个布尔值 True 或者 False。

例如,当年龄小于 18 或者大于 65 时,我们希望 person 对象返回 False:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __bool__(self):
        if self.age < 18 or self.age > 65:
            return False
        return True


if __name__ == '__main__':
    person = Person('Jane', 16)
    print(bool(person))  # False

在以上示例中,如果 age 小于 18 或者大于 65,__bool__ 方法将会返回 False;否则,它会返回 True。person 对象的年龄为16,因此它的布尔值为 False。

__len__ 方法

如果一个自定义类没有实现 __bool__ 方法,Python 会使用 __len__ 方法。如果 __len__ 方法返回 0,对象的布尔值就时 False;否则就是 True。

如果一个类既没有实现 __bool__ 方法,也没有实现 __len__ 方法,对象的布尔值为 True。

以下示例中的 Payroll 类没有实现 __bool__ 方法,但是实现了 __len__ 方法:

class Payroll:
    def __init__(self, length):
        self.length = length

    def __len__(self):
        print('len was called...')
        return self.length


if __name__ == '__main__':
    payroll = Payroll(0)
    print(bool(payroll))  # False

    payroll.length = 10
    print(bool(payroll))  # True

由于 Payroll 类没有覆盖 __bool__ 方法,Python 会使用 __len__ 方法返回对象的布尔值。

总结

  • 所有自定义类的对象默认都会返回 True。
  • 使用 __bool__ 方法覆盖默认行为,该方法必须返回 True 或 False。
  • 如果一个类没有实现 __bool__ 方法,Python 会使用 __len__ 方法的返回结果。如果这两个方法都没有实现,默认返回 True。

以上是关于Python面向对象编程第14篇 特殊方法之__bool__的主要内容,如果未能解决你的问题,请参考以下文章

Python面向对象编程第15篇 特殊方法之__del__

Python面向对象编程第15篇 特殊方法之__del__

Python面向对象编程第12篇 特殊方法之__eq__

Python面向对象编程第12篇 特殊方法之__eq__

Python面向对象编程第13篇 特殊方法之__hash__

Python面向对象编程第13篇 特殊方法之__hash__