Простой Python. Современный стиль программирования (Любанович) - страница 94

В следующем примере показана наша первая попытка, где мы вызываем обычный метод equals(). self.text — это текстовая строка, которую содержит объект класса Word, метод equals() сравнивает ее с текстовой строкой, содержащейся в объекте word2 (другой объект класса Word):

>>>> class Word():

>…····def __init__(self, text):

>…········self.text = text

>…

>…····def equals(self, word2):

>…········return self.text.lower() == word2.text.lower()

>…

Далее создадим три объекта Word с помощью трех разных текстовых строк:

>>>> first = Word('ha')

>>>> second = Word('HA')

>>>> third = Word('eh')

Когда строки 'ha' и 'HA' сравниваются в нижнем регистре, они должны быть равными:

>>>> first.equals(second)

>True

Но строка 'eh' не совпадет со строкой 'ha':

>>>> first.equals(third)

>False

Мы определили метод equals(), который выполняет преобразование строки в нижний регистр и сравнение. Однако было бы здорово, если бы мы могли просто сказать first == second, как в случае встроенных типов Python. Реализуем такую возможность. Мы изменим имя метода equals() на особое имя __eq__() (вы узнаете, зачем я это сделал, через минуту):

>>>> class Word():

>…·····def __init__(self, text):

>…·········self.text = text

>…·····def __eq__(self, word2):

>…·········return self.text.lower() == word2.text.lower()

>…

Проверим, как это работает:

>>>> first = Word('ha')

>>>> second = Word('HA')

>>>> third = Word('eh')

>>>> first == second

>True

>>>> first == third

>False

Магия! Все, что нам было нужно, — указать особое имя метода для проверки на равенство __eq__(). В табл. 6.1 и 6.2 приведены имена самых полезных магических методов.


Таблица 6.1. Магические методы для сравнения
__eq__(self, other)self == other
__ne__(self, other)self!= other
__lt__(self, other)self < other
__gt__(self, other)self > other
__le__(self, other)self <= other
__ge__(self, other)self >= other

Таблица 6.2. Магические методы для вычислений

__add__(self, other)self + other
__sub__(self, other)self — other
__mul__(self, other)self * other
__floordiv__(self, other)self // other
__truediv__(self, other)self / other
__mod__(self, other)self % other
__pow__(self, other)self ** other

Не обязательно использовать математические операторы вроде + (магический метод __add__()) и — (магический метод __sub__()) только для работы с числами. Например, строковые объекты используют + для конкатенации и * для дуплицирования. Существует множество других методов, задокументированных онлайн по адресу http://bit.ly/pydocs-smn. Наиболее распространенные из них представлены в табл. 6.3.


Таблица 6.3. Другие магические методы
__str__(self)