在python中定义类的“布尔”


73

为什么不像天真的预期那样起作用?

class Foo(object):
    def __init__(self):
        self.bar = 3
    def __bool__(self):
        return self.bar > 10

foo = Foo()

if foo:
    print 'x'
else:
    print 'y'

(输出为x

Answers:


71

为了与Python 2-3兼容,只需将其添加到示例中:

Foo.__nonzero__ = Foo.__bool__

或将Foo的原始定义扩展为包括:

__nonzero__ = __bool__

当然,您也可以反向定义它们,方法名称在哪里,__nonzero__然后将其分配给__bool__,但是我认为该名称__nonzero__只是Python根据其与对象的等价性将对象解释为真或假的原始C-ishness的遗产。零。只需添加上面的语句,您的代码即可在Python 2.x上运行,并且在升级到Python 3.x时会自动运行(最终您将工作分配到__nonzero__)。


这些插入将去哪里?我猜第一个可以在行后return self.bar > 10紧缩(0个空格),第二个可以在行前def __init__(self):紧缩(4个空格)。那是对的吗?或将第二个必须去__bool__定义是什么?
甲虫

65

__bool__方法在Python 3中使用。对于Python 2,需要__nonzero__


1
是的,奇怪但真实。很高兴看到他们将实施方式更改为“一种显而易见的方式”
2011年

6
@wim:不太奇怪。该__nonzero__()方法显着名早于引入的类型的bool在Python。在此之前bool,只需使用整数01
Sven Marnach 2011年

1
@SvenMarnach:你们曾01Dilbert ;-)
JS。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.