Простой Python. современный стиль программирования - читать онлайн бесплатно полную версию книги . Страница 129

Предположим, у вас есть простой класс Word и вы хотите написать для него ме-

тод equals(), который сравнивает два слова, игнорируя регистр. Так и есть, объект

класса Word, содержащий значение 'ha', будет считаться равным другому объекту,

который содержит значение 'HA'.

В следующем примере показана наша первая попытка, где мы вызываем обыч-

ный метод equals(). self.text — это текстовая строка, которую содержит объект

класса Word, метод equals() сравнивает ее с текстовой строкой, содержащейся в объ-

екте word2 (другой объект класса Word):

>>> class Word():

... def __init__(self, text):

Особые методы

173

... 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 приведены имена самых полезных магических

методов.