在python中定义类的"boolness"

wim*_*wim 64 python boolean class python-2.x python-2.7

为什么这不是天真的预期?

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'
Run Code Online (Sandbox Code Playgroud)

(输出是x)

Pau*_*McG 68

对于Python 2-3兼容性,只需将其添加到您的示例中:

Foo.__nonzero__ = Foo.__bool__
Run Code Online (Sandbox Code Playgroud)

或者扩展Foo的原始定义以包括:

__nonzero__ = __bool__
Run Code Online (Sandbox Code Playgroud)

你当然也可以反过来定义它们,方法名称是__nonzero__你所指定的__bool__,但是我认为这个名称__nonzero__只是Python根据它们的等价性将对象解释为真实或虚假的原始C-ishness的遗产.零.只需添加上面的语句,您的代码将与Python 2.x一起使用,并在升级到Python 3.x时自动工作(并最终将您的任务分配给__nonzero__).

  • 我喜欢这个词,C-ishness (4认同)
  • 我是一个新生儿. (3认同)

Cat*_*lus 58

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

  • @wim:不太奇怪.`__nonzero __()`方法名称大大早于在Python中引入类型`bool`.在`bool`之前,只需使用整数"0"和"1". (6认同)
  • @SvenMarnach:你们有“0”和“1”?[呆伯特](http://dilbert.com/strips/comic/1992-09-08/) ;-) (3认同)

Sve*_*ach 24

因为相应的特殊方法是__nonzero__()在Python 2中调用的,而不是__bool__()在Python 3之前调用.