Подтвердить что ты не робот

Определение "boolness" класса в 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)

4b9b3361

Ответ 1

Для совместимости с Python 2-3 просто добавьте это в свой пример:

Foo.__nonzero__ = Foo.__bool__

или разверните исходное определение Foo, чтобы включить:

__nonzero__ = __bool__

Конечно, вы также можете определить их в обратном порядке, где имя метода __nonzero__, и вы назначаете его __bool__, но я думаю, что имя __nonzero__ является просто наследием оригинальной C-истичности Python интерпретация объектов как правды или фальши, основанная на их эквивалентности с нулем. Просто добавьте вышеприведенное выражение, и ваш код будет работать с Python 2.x и будет автоматически работать при обновлении до Python 3.x(и, в конечном итоге, вы потеряете назначение __nonzero__).

Ответ 2

Метод __bool__ используется в Python 3. Для Python 2 вы хотите __nonzero__.

Ответ 3

Поскольку соответствующий специальный метод называется __nonzero__() в Python 2, а не __bool__() до Python 3.