返回介绍

布尔测试:__bool__ 和 __len__

发布于 2024-01-29 22:24:15 字数 1622 浏览 0 评论 0 收藏 0

正如前面所提到的,类可能也定义了赋予其实例布尔特性的方法——在布尔环境中,Python首先尝试__bool__来获取一个直接的布尔值,然后,如果没有该方法,就尝试__len__类根据对象的长度确定一个真值。通常,首先使用对象状态或其他信息来生成一个布尔结果:

如果没有这个方法,Python退而求其次地求长度,因为一个非空对象看作是真(如,一个非零长度意味着对象是真的,并且一个零长度意味着它为假):

如果两个方法都有,Python喜欢__bool__胜过__len__,因为它更具体:

如果没有定义真的方法,对象毫无疑义地看作为真:

既然我们已经尝试突入哲学的领域,让我们进一步来看看最后一种重载环境:对象转让。

Python 2.6中的布尔

Python 2.6用户应该在“布尔测试:__bool__和__len__”节的所有代码中使用__nonzero__而不是__bool__。Python 3.0把Python 2.6的__nonzero__方法重新命名为__bool__,但布尔测试以相同的方式工作(Python 3.0和Python 2.6都使用__len__作为候补)。

如果你没有使用Python 2.6的名称,本节中的第一个测试将会同样地工作,但是,仅仅因为__bool__在Python 2.6中没有识别为一个特殊的方法名称,并且对象默认看作是真的!

要见证这个版本的不同之处,你需要返回False:

这在Python 3.0中像宣传的那样有效。然而,在Python 2.6中,__bool__被忽视并且对象总是看作是真:

在Python 2.6中,针对布尔值使用__nonzero__(或者从设置为假的__len__候补方法返回0):

但是,别忘了,__nonzero__只在Python 2.6中有效;如果在Python 3.0中使用,它将默认地忽略,并且对象将被默认地分类为真——就像是在Python 2.6中使用__bool__一样。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文