web-dev-qa-db-ja.com

pythonでクラスの「boolness」を定義する

なぜこれは単純に期待したように機能しないのですか?

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です)

66
wim

Python 2-3の互換性のために、例にこれを追加してください:

Foo.__nonzero__ = Foo.__bool__

または、Fooの元の定義を拡張して以下を含めます。

__nonzero__ = __bool__

もちろん、逆に定義することもできます。メソッド名は__nonzero__で、__bool__に割り当てますが、__nonzero__という名前は、元のC-ゼロとの同等性に基づいたオブジェクトの真実または偽物としてのPythonの解釈のishness。上記のステートメントを追加するだけで、コードはPython 2.xで動作し、Python 3.xにアップグレードすると自動的に動作し、最終的には__nonzero__への割り当てのドロップ)。

68
PaulMcG

__bool__ メソッドはPython 3.で使用されています。Python 2の場合、__nonzero__

57
Cat Plus Plus

対応する特別なメソッドは __nonzero__() in Python 2ではなく __bool__() ではないため、 Python 3。

24
Sven Marnach