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

>>>> class Car():

>…·····def exclaim(self):

>…·········print("I'm a Car!")

>…

>>>> class Yugo(Car):

>…·····pass

>…

Наконец, создадим по одному объекту каждого класса и вызовем их методы exclaim:

>>>> give_me_a_car = Car()

>>>> give_me_a_yugo = Yugo()

>>>> give_me_a_car.exclaim()

>I'm a Car!

>>>> give_me_a_yugo.exclaim()

>I'm a Car!

Не сделав ничего особенного, класс Yugo унаследовал метод exclaim() класса Car. Фактически класс Yugo говорит, что он является классом Car, что может привести к кризису самоопределения. Посмотрим, что мы можем с этим сделать.

Перегрузка метода

Как вы только что увидели, новый класс наследует все, что находится в его классе-предке. Далее вы увидите, как можно заменить, или перегрузить, родительские методы. Класс Yugo должен как-то отличаться от класса Car, иначе зачем вообще создавать новый класс. Изменим способ работы метода exclaim() для класса Yugo:

>>>> class Car():

>…·····def exclaim(self):

>…·········print("I'm a Car!")

>…

>>>> class Yugo(Car):

>…·····def exclaim(self):

>…·········print("I'm a Yugo! Much like a Car, but more Yugo-ish.")

>…

Теперь создадим объекты этих классов:

>>>> give_me_a_car = Car()

>>>> give_me_a_yugo = Yugo()

Что они говорят?

>>>> give_me_a_car.exclaim()

>I'm a Car!

>>>> give_me_a_yugo.exclaim()

>I'm a Yugo! Much like a Car, but more Yugo-ish.

В этих примерах мы перегрузили метод exclaim(). Перегрузить можно любые методы, включая __init__(). Рассмотрим другой пример, который использует наш более старый класс Person. Создадим подклассы, которые представляют докторов (MDPerson) и адвокатов (JDPerson):

>>>> class Person():

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

>…·········self.name = name

>…

>>>> class MDPerson(Person):

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

>…·········self.name = "Doctor " + name

>…

>>>> class JDPerson(Person):

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

>…·········self.name = name +", Esquire"

>…

В этих случаях метод инициализации __init__() принимает те же аргументы, что и родительский класс Person, но внутри объекта сохраняет значение переменной name разными способами:

>>>> person = Person('Fudd')

>>>> doctor = MDPerson('Fudd')

>>>> lawyer = JDPerson('Fudd')

>>>> print(person.name)

>Fudd

>>>> print(doctor.name)

>Doctor Fudd

>>>> print(lawyer.name)

>Fudd, Esquire

Добавление метода

В класс-потомок можно также добавить метод, которого не было в родительском классе. Возвращаясь к классам Car и Yugo, мы определим новый метод need_a_push() только для класса Yugo:

>>>> class Car():

>…·····def exclaim(self):

>…·········print("I'm a Car!")

>…

>>>> class Yugo(Car):

>…·····def exclaim(self):

>…·········print("I'm a Yugo! Much like a Car, but more Yugo-ish.")