【发布时间】:2011-07-14 10:10:57
【问题描述】:
我发现使用以下构造检查对象是否为“空”非常方便:
l=[]
if l:
do_stuff()
对于标准的python列表,if只有在列表不为空时才会被执行。
我的问题是,我怎样才能为自己的对象实现相同的想法?
【问题讨论】:
标签: python object operator-overloading
我发现使用以下构造检查对象是否为“空”非常方便:
l=[]
if l:
do_stuff()
对于标准的python列表,if只有在列表不为空时才会被执行。
我的问题是,我怎样才能为自己的对象实现相同的想法?
【问题讨论】:
标签: python object operator-overloading
定义一个方法__bool__ (Python 3.x) 或__nonzero__ (2.x)。或者为可移植性定义两者,其中一个返回另一个的结果。
【讨论】:
__bool__ 是后来添加的。它们应该执行相同的操作,定义两者,其中一个调用另一个应该是安全的。
__nonzero__ 是 Python 2.x,__bool__ 是 Python 3.x。
__bool__ 反向移植到 2.6,但显然我错了。
__bool__ 对于非集合类型更有意义。
为 Python 2 实现 __nonzero__,为 Python 3 实现 __bool__:
class AlwaysTrueObject:
def __bool__(self):
return True
__nonzero__ = __bool__
【讨论】:
__nonzero__ = __bool__ 效果一样。
如果你实现了__len__,Python 会为你做这件事,假设长度为 0 意味着对象的布尔值是 False,否则它的布尔值是 True。
如果实现__len__ 没有意义,您可以实现__nonzero__(或3.x 中的__bool__(只是名称已更改)),它应该返回True 或False取决于对象的布尔值。
【讨论】: