Определение "логичности" класса в python
почему это не работает, как можно было наивно ожидать?
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
)
3 ответа:
для совместимости с Python 2-3 просто добавьте это в свой пример:
Foo.__nonzero__ = Foo.__bool__
или разверните исходное определение Foo, чтобы включить:
__nonzero__ = __bool__
вы могли бы, конечно, определить их в обратном порядке тоже, где имя метода
__nonzero__
и назначить ему__bool__
, но я думаю, что название__nonzero__
это просто наследие первоначальной C-ishness интерпретации Python объектов как истинных или ложных, основанных на их эквивалентности с нулем. Просто добавьте инструкцию, и вы код будет работать с Python 2.x, и будет автоматически работать при обновлении до Python 3.x (и в конце концов вы отбрасываете задание на__nonzero__
).
The
__bool__
метод используется в Python 3. Для Python 2, вы хотите__nonzero__
.
потому что соответствующий специальный метод называется
__nonzero__()
в Python 2, а не__bool__()
до Python 3.