1. 主页
  2. Python基础到高级
  3. 魔术方法
  4. bool

bool

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

我们要如何帮助您?

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注