В следующем примере показана наша первая попытка, где мы вызываем обычный метод 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. Другие магические методы