なぜこれは単純に期待したように機能しないのですか?
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 2-3の互換性のために、例にこれを追加してください:
Foo.__nonzero__ = Foo.__bool__
または、Fooの元の定義を拡張して以下を含めます。
__nonzero__ = __bool__
もちろん、逆に定義することもできます。メソッド名は__nonzero__
で、__bool__
に割り当てますが、__nonzero__
という名前は、元のC-ゼロとの同等性に基づいたオブジェクトの真実または偽物としてのPythonの解釈のishness。上記のステートメントを追加するだけで、コードはPython 2.xで動作し、Python 3.xにアップグレードすると自動的に動作し、最終的には__nonzero__
への割り当てのドロップ)。
__bool__
メソッドはPython 3.で使用されています。Python 2の場合、__nonzero__
。
対応する特別なメソッドは __nonzero__()
in Python 2ではなく __bool__()
ではないため、 Python 3。