【问题标题】:Defining "boolness" of a class in python在python中定义一个类的“boolness”
【发布时间】:2012-01-02 13:59:14
【问题描述】:

为什么这不能像人们天真的预期的那样工作?

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

【问题讨论】:

    标签: python python-2.7 class boolean python-2.x


    【解决方案1】:

    因为对应的特殊方法在 Python 2 中称为 __nonzero__(),而直到 Python 3 才称为 __bool__()

    【讨论】:

      【解决方案2】:

      __bool__ 方法用于 Python 3。对于 Python 2,您需要 __nonzero__

      【讨论】:

      • 对,奇怪但真实。很高兴看到他们将实施更改为“一种明显的方法”
      • @wim:不太奇怪。 __nonzero__() 方法名称大大早于 Python 中 bool 类型的引入。在bool 之前,只需使用整数01
      • @SvenMarnach:你们有01Dilbert ;-)
      【解决方案3】:

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

      Foo.__nonzero__ = Foo.__bool__
      

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

      __nonzero__ = __bool__
      

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

      【讨论】:

      • 这些插入会去哪里?我猜第一个可以紧跟在return self.bar > 10 行之后(缩进0 个空格),而第二个可以紧跟在def __init__(self): 行之前(缩进4 个空格)。那是对的吗?或者第二个必须 __bool__ 定义之后?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-02
      • 2014-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多