Магический метод __bool__ в Python: возврат логического значения

В этом уроке вы узнаете, как реализовать магический метод  __bool__ в Python, возвращающий логические значения для объектов пользовательского класса.

Введение в метод __bool__ в Python

Объект пользовательского класса связан с логическим значением. По умолчанию оно оценивается как True. Например:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age


if __name__ == '__main__':
    person = Person('John', 25)

В этом примере мы определяем класс Person, создаем экземпляр объекта и показываем его логическое значение. Как и ожидалось, объект person имеет значение True.

Чтобы переопределить это поведение по умолчанию, вы реализуете специальный метод __bool__. Метод __bool__ должен возвращать логическое значение True или False.

Например, предположим, что вы хотите, чтобы объект person оценивал значение False, если возраст человека младше 18 или старше 65 лет:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __bool__(self):
        if self.age < 18 or self.age > 65:
            return False
        return True


if __name__ == '__main__':
    person = Person('Jane', 16)
    print(bool(person))  # False

В этом примере метод __bool__ возвращает False, если возраст меньше 18 или больше 65 лет. В противном случае он возвращает True. Объект person имеет значение возраста 16, поэтому в этом случае он возвращает False.

Метод __len__

Если в пользовательском классе нет метода __bool__, Python будет искать метод __len__(). Если __len__ равен нулю, объект имеет значение False. В противном случае — True.

Если класс не реализует методы __bool__ и __len__, объекты класса будут иметь значение True.

Ниже определяется класс Payroll, который реализует не __bool__, а метод __len__:

class Payroll:
    def __init__(self, length):
        self.length = length

    def __len__(self):
        print('len was called...')
        return self.length


if __name__ == '__main__':
    payroll = Payroll(0)
    print(bool(payroll))  # False

    payroll.length = 10
    print(bool(payroll))  # True

Поскольку класс Payroll не переопределяет метод __bool__, Python ищет метод __len__ при оценке объектов Payroll до логического значения.

В следующем примере __len__ расчета заработной платы возвращает 0, что является False:

payroll = Payroll(0)
print(bool(payroll))  # False

Однако следующий пример __len__ возвращает 10, что соответствует действительности:

payroll.length = 10
print(bool(payroll))  # True
Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *