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

Это статический метод, перед которым располагается декоратор @staticmethod,

не имеющий в качестве начального параметра ни self, ни класс class. Рассмотрим

пример, который служит в качестве рекламы класса CoyoteWeapon:

>>> class CoyoteWeapon():

... @staticmethod

... def commercial():

... print('This CoyoteWeapon has been brought to you by Acme')

...

>>>

>>> CoyoteWeapon.commercial()

This CoyoteWeapon has been brought to you by Acme

Обратите внимание на то, что нам не нужно создавать объект класса CoyoteWeapon,

чтобы получить доступ к этому методу. Это здорово.

Утиная типизация

В Python имеется также реализация полиморфизма — это значит, что одна операция

может быть произведена над разными объектами независимо от их класса.

Используем уже знакомый нам инициализатор __init__() для всех трех классов

Quote, но добавим две новые функции:

 who() возвращает значение сохраненной строки person;

 says() возвращает сохраненную строку words, имеющую особую пунктуацию.

Посмотрим на них в действии:

>>> class Quote():

... def __init__(self, person, words):

... self.person = person

Утиная типизация

171

... self.words = words

... def who(self):

... return self.person

... def says(self):

... return self.words + '.'

...

>>> class QuestionQuote(Quote):

... def says(self):

... return self.words + '?'

...

>>> class ExclamationQuote(Quote):

... def says(self):

... return self.words + '!'

...

>>>

Мы не меняли способ инициализации классов QuestionQuote и ExclamationQuote,

поэтому не перегружали их методы __init__(). Далее Python автоматически вы-

зывает метод __init__() родительского класса Quote, чтобы сохранить переменные

объекта person и words. Поэтому мы можем получить доступ к атрибуту self.words

в объектах, созданных с помощью подклассов QuestionQuote и ExclamationQuote.

Далее создадим несколько объектов:

>>> hunter = Quote('Elmer Fudd', "I'm hunting wabbits")

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

Elmer Fudd says: I'm hunting wabbits.