|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
学习不同方法的代偿时,碰到的问题也不一样,各位老师都给了非常大的帮助,非常感谢, 请看看下面的问题:
- >>> class D:
- def __bool__(self):
- print('Bool')
- return True
-
- >>> d = D()
- >>> bool(d)
- Bool
- True
复制代码
上面的代码是正常的代码,定义了__bool__方法,无论何种情况,都会返回True
- >>> class D:
- def __init__(self, data):
- self.data = data
- def __len__(self):
- print('len:', len(self.data))
- return len(self.data)
-
- >>> d = D('cat')
- >>> bool(d)
- len: 3
- True
复制代码
上面的代码是用 __len__方法代偿的代码,让我不理解的是,办法中的 return 返回的是len(self.data),应该是3啊,为什么返回结果是True呢? 是不是还有什么函数悄悄在起作用啊?
在Python中,所有对象都可以被看作是真值或假值。当执行布尔运算如`bool(a)`时,Python将调用其相应的魔术方法(`__bool__`, `__len__`, `__nonzero__`)之一(按优先级顺序)。只要其中一个方法返回了True或者非零整数,则该对象就被视为真值;否则,它被视为假值。
因此,在你引入的例子中,类`D`没有实现`__bool__`方法,但是实现了`__len__`方法,所以在计算布尔值时,Python会尝试调用`__len__`方法并通过检查返回值是否为零来确定该对象的布尔值。如果该对象存在且其长度不为零,则返回True,否则返回False。
所以在你的例子中,调用`bool(d)`会首先尝试调用`d.__bool__()` 方法,但是由于该方法不存在,Python会自动调用`d.__len__()`方法,它打印出了长度并返回了非零的长度值3,这就是为什么可以打印 "len: 3" 而返回True的原因。
求最佳答案
|
|