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

>>> hunted1 = QuestionQuote('Bugs Bunny', "What's up, doc")

>>> print(hunted1.who(), 'says:', hunted1.says())

Bugs Bunny says: What's up, doc?

>>> hunted2 = ExclamationQuote('Daffy Duck', "It's rabbit season")

>>> print(hunted2.who(), 'says:', hunted2.says())

Daffy Duck says: It's rabbit season!

Три разные версии метода says() обеспечивают разное поведение трех классов.

Так выглядит традиционный полиморфизм в объектно-ориентированных языках.

Python пошел немного дальше и позволяет вам вызывать методы who() и says() для

любых объектов, включающих эти методы. Определим класс BabblingBrook, который

не имеет никакого отношения к нашим охотнику и его жертвам (наследникам

класса Quote), созданным ранее:

>>> class BabblingBrook():

... def who(self):

... return 'Brook'

... def says(self):

... return 'Babble'

...

>>> brook = BabblingBrook()

172

Глава 6. Ой-ой-ой: объекты и классы

Теперь запустим методы who() и says() разных объектов, один из которых (brook)

совершенно не связан с остальными:

>>> def who_says(obj):

... print(obj.who(), 'says', obj.says())

...

>>> who_says(hunter)

Elmer Fudd says I'm hunting wabbits.

>>> who_says(hunted1)

Bugs Bunny says What's up, doc?

>>> who_says(hunted2)

Daffy Duck says It's rabbit season!

>>> who_says(brook)

Brook says Babble

Такое поведение иногда называется утиной типизацией благодаря старой по-

говорке «Если нечто выглядит как утка, плавает как утка и крякает как утка, то это,

вероятно, утка и есть».

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

Теперь вы можете создавать и использовать простые объекты, но опустимся не-

много глубже и сделаем нечто большее.

Когда вы пишете что-то вроде a = 3 + 8, откуда целочисленные объекты со зна-

чениями 3 и 8 узнают, как реализовать операцию +? Кроме того, откуда a знает, как

использовать =, чтобы получить результат? Вы можете воспользоваться этими

операторами, применяя специальные методы Python (также можно назвать их

магическими методами). Вам не нужно быть Гэндальфом, чтобы творить магию,

эти методы совсем не сложны.

Имена этих методов начинаются с двойных подчеркиваний (__) и заканчиваются

ими. Вы уже видели один такой метод: __init__ инициализирует только что создан-

ный объект с помощью описания его класса и любых аргументов, которые были

переданы в этот метод.