только для класса Yugo:
>>> class Car():
... def exclaim(self):
... print("I'm a Car!")
Просим помощи у предка с помощью ключевого слова super
163
...
>>> class Yugo(Car):
... def exclaim(self):
... print("I'm a Yugo! Much like a Car, but more Yugo-ish.")
... def need_a_push(self):
... print("A little help here?")
...
Далее создадим объекты классов Car и Yugo:
>>> give_me_a_car = Car()
>>> give_me_a_yugo = Yugo()
Объект класса Yugo может реагировать на вызов метода need_a_push():
>>> give_me_a_yugo.need_a_push()
A little help here?
А объект общего класса Car — нет:
>>> give_me_a_car.need_a_push()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Car' object has no attribute 'need_a_push'
К этому моменту класс Yugo может делать что-то, чего не может делать класс Car,
и теперь мы точно можем определить отдельную личность класса Yugo.
Просим помощи у предка
с помощью ключевого слова super
Мы видели, как класс-потомок может добавить или перегрузить метод класса-предка.
Но что, если вам нужно вызвать оригинальный метод родительского класса? «Рад,
что вы спросили», — говорит метод super(). Мы определим новый класс, который
называется EmailPerson и представляет объект класса Person, содержащий адрес элек-
тронной почты. Для начала запишем наше привычное определение класса Person:
>>> class Person():
... def __init__(self, name):
... self.name = name
...
Обратите внимание на то, что вызов метода __init__() в следующем подклассе
имеет дополнительный параметр email:
>>> class EmailPerson(Person):
... def __init__(self, name, email):
... super().__init__(name)
... self.email = email
164
Глава 6. Ой-ой-ой: объекты и классы
Когда вы определяете метод __init__() для своего класса, вы заменяете метод
__init__() родительского класса, который больше не вызывается автоматически.
В результате вам нужно вызывать его явно. Происходит следующее.
Метод super() получает определение родительского класса Person.