Магический метод __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