>>>> 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.")