180 Глава 9 • Классы
ПРИМЕЧАНИЕ Подобные методы управляют обновлением внутренних значений эк-
земпляров (таких, как показания одометра), однако любой пользователь, имеющий до-
ступ к программному коду, сможет напрямую задать атрибуту любое значение . Эффек-
тивная схема безопасности должна уделять особое внимание таким подробностям, не
ограничиваясь простейшими проверками .
УПРАЖНЕНИЯ 9.4. Посетители: начните с программы из упражнения 9.1 (с. 175). Добавьте атрибут
number_served
со значением по умолчанию
0
; он представляет количество обслуженных
посетителей. Создайте экземпляр с именем
restaurant
. Выведите значение
number_served
,
потом измените и выведите снова.
Добавьте метод с именем
set_number_served()
, позволяющий задать количество обслужен-
ных посетителей. Вызовите метод с новым числом, снова выведите значение.
Добавьте метод с именем
increment_number_served()
, который увеличивает количество об-
служенных посетителей на заданную величину. Вызовите этот метод с любым числом, ко-
торое могло бы представлять количество обслуженных клиентов, — скажем, за один день.
9.5. Попытки входа: добавьте атрибут
login_attempts
в класс
User
из упражнения 9.3
(с. 175). Напишите метод
increment_login_attempts()
, увеличивающий значение
login_
attempts
на
1
. Напишите другой метод с именем
reset_login_attempts()
, обнуляющий зна-
чение
login_attempts
.
Создайте экземпляр класса
User
и вызовите
increment_login_attempts()
несколько раз.
Выведите значение
login_attempts
, чтобы убедиться в том, что значение было измене-
но правильно, а затем вызовите
reset_login_attempts()
. Снова выведите
login_attempts
и убедитесь в том, что значение обнулилось.
Наследование
Работа над новым классом не обязана начинаться с нуля. Если класс, который
вы пишете, представляет собой специализированную версию ранее написанного
класса, вы можете воспользоваться
наследованием . Один класс,
наследующий от
другого, автоматически получает все атрибуты и методы первого класса. Исходный
класс называется
родителем , а новый класс —
потомком . Класс-потомок наследует
атрибуты и методы родителя, но при этом также может определять собственные
атрибуты и методы.
Метод __init__() класса-потомка
При написании нового класса на базе существующего класса часто приходится вы-
зывать метод
__init__()
класса-родителя. При этом происходит инициализация
любых атрибутов, определенных в методе
__init__()
родителя, и эти атрибуты
становятся доступными для класса-потомка.
Например, попробуем построить модель электромобиля. Электромобиль пред-
ставляет собой специализированную разновидность автомобиля, поэтому новый
класс
ElectricCar
можно создать на базе класса
Car
, написанного ранее. Тогда
Наследование
181 нам останется добавить в него код атрибутов и поведения, относящегося только
к электромобилям.
Начнем с создания простой версии класса
ElectricCar
, который делает все, что
делает класс
Car
: