В Python, какой оператор переопределить для "if object:"?

Мне очень удобно проверять, является ли объект "пустым" со следующей конструкцией:

l=[]
if l:
     do_stuff()

Для стандартного списка python if будет выполняться, только если список не пуст.

Мой вопрос в том, как я могу реализовать ту же идею для своих собственных объектов?

Ответы

Ответ 1

Определите метод __bool__ (Python 3.x) или __nonzero__ (2.x). Или определите как переносимость, так и один, возвращающий результат другого.

Ответ 2

Внедрите __nonzero__ для Python 2 и __bool__ для Python 3:

class AlwaysTrueObject:
    def __bool__(self):
        return True
    __nonzero__ = __bool__

Ответ 3

Если вы реализуете __len__, Python сделает это для вас в предположении, что длина 0 означает, что объект имеет логическое значение False и что он имеет логическое значение True в противном случае.

Если нет смысла реализовывать __len__, вы можете реализовать __nonzero__ (или __bool__ в 3.x(только имя изменилось)), который должен возвращать либо True, либо False в зависимости от логического значения объекта.