Python中对象的布尔值

41 投票
2 回答
29989 浏览
提问于 2025-04-15 12:42

大家都知道,Python 有布尔值的概念。简单来说,如果一个类里面有一个叫做 __len__ 的方法,那么这个类的实例如果调用 __len__() 返回 0,就会被认为是布尔值 False(比如说,一个空列表就是这样的)。

实际上,任何可迭代的空对象在布尔表达式中出现时,都会被评估为 False

现在假设我有一个叫做 foo 的类,它有一个属性 bar。我该如何定义它的真值呢?比如说,当 bar % 2 == 0 时,它的值应该是 True,否则就是 False

举个例子:

myfoo = foo()
myfoo.bar = 3
def a(foo):
    if foo:
        print "spam"
    else:
        print "eggs"

所以,调用 a(myfoo) 应该打印出 "eggs"


如果你有关于 调试错误 的问题,特别是因为在 2.x 中使用了 3.x 特有的方法导致的错误,可以参考这个链接:如何在 2.x 中为类实现布尔值转换?为什么 "__bool__" 魔法方法不起作用?

2 个回答

59

Python 2.x

使用 __nonzero__ 这个特殊的方法。当你在布尔上下文中使用一个对象时,Python会自动调用这个方法。这个方法需要返回一个布尔值,也就是“真”或“假”,这个值会被用来进行判断。

例如:

class Foo(object):

    def __init__(self, bar) :
        self.bar = bar

    def __nonzero__(self) :
        return self.bar % 2 == 0

if __name__ == "__main__":
     if (Foo(2)) : print "yess !"

Python 3.x

在Python 3.x中,使用 __bool__ 方法,方法的使用方式和Python 2.x是一样的。

38

在Python 2中,使用 __nonzero__

可以查看Python 2的文档了解更多关于 __nonzero__ 的信息。

class foo(object):
    def __nonzero__( self) :
        return self.bar % 2 == 0

def a(foo):
    if foo:
        print "spam"
    else:
        print "eggs"

def main():
    myfoo = foo()
    myfoo.bar = 3
    a(myfoo)

if __name__ == "__main__":
    main()

撰写回答