Определение "логичности" класса в 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 58

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.