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__的主要内容,如果未能解决你的问题,请参考以下文章