bool
当给对象做bool判断的时候,就是在调用对象的__bool__方法
In [3]: class F:
...: def __bool__(self): # 定义一个__bool__方法,返回值为False
...: return False
...:
In [4]: bool(F()) # 通过bool内置获取到了False
Out[4]: False
In [5]: class T:
...: def __bool__(self): # 定义一个__bool__方法,返回值为True
...: return True
...:
In [6]: bool(T()) # 通过bool内置获取到了True
Out[6]: True
当对象没有实现__bool__方法的时候,如果实现了__len__方法,bool返回值为len(object) != 0
In [7]: class Sized:
...: def __init__(self, size):
...: self.size = size
...: def __len__(self): # 定义一个__len__方法
...: return self.size
...:
In [8]: bool(Sized(0)) # 当len方法返回0的时候,则是False
Out[8]: False
In [9]: bool(Sized(1)) # 当len方法返回非0的时候,则是True
Out[9]: True
当对象即没有__bool__方法,也没有实现__len__方法的时候,bool返回值为True
In [10]: class G: # G是没有__bool和__len__方法的
...: pass
...:
In [11]: bool(G()) # 通过bool获取到了G是True
Out[11]: True
当同时实现__bool__和__len__方法的时候,那么__bool__的优先级最高
In [13]: class Sized:
...: def __init__(self, size):
...: self.size = size
...: def __len__(self):
...: return self.size
...: def __bool__(self): # 判断size参数的值,是否等于0,等于0则是True,否则是False
...: return self.size == 0
...:
In [14]: bool(Sized(0)) # 当给size传递0参数的时候 size = 0 因此,返回True
Out[14]: True
In [15]: bool(Sized(10)) # 当给size传递非0参数的时候 size 不等于 0 因此,返回False
Out[15]: False
由此可以看出__bool__比__len__的优先级高
__bool__方法必须返回bool类型的值,或者返回可以表示是bool类型数据的值
In [17]: class H:
...: def __bool__(self): # 定义一个__bool__方法,返回的是一组字符串
...: return 'abc'
...:
In [18]: bool(H()) # 通过bool方法来获取类H的__bool__方法的返回值的时候抛出了异常, __bool__方法不能返回str类型的数据
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-18-dc7b2ec7cd49> in <module>()
----> 1 bool(H())
TypeError: __bool__ should return bool, returned str