Глава 9 • Классы
Также возможно связать метод
get_range()
с аккумулятором, но передавать ему
параметр (например,
car_model
). Метод
get_range()
будет определять запас хода
на основании мощности аккумулятора и модели автомобиля.
Если вы начнете ломать голову над такими вопросами, это означает, что вы мыс-
лите на более высоком логическом уровне, не ограничиваясь уровнем синтаксиса.
Вы думаете уже не о Python, а о том, как представить реальный мир в коде. И, до-
стигнув этой точки, вы поймете, что однозначно правильного или неправильного
подхода к моделированию реальных ситуаций часто не существует. Некоторые
методы эффективнее других, но для того, чтобы найти наиболее эффективную
реализацию, необходим практический опыт. Если ваш код работает именно так,
как вы хотели, — значит, у вас все получается! Не огорчайтесь, если окажется, что
вы по несколько раз переписываете свои классы для разных решений. На пути
к написанию точного, эффективного кода все программисты проходят через этот
процесс.
УПРАЖНЕНИЯ
9-6 . Киоск с мороженым: киоск с мороженым — особая разновидность ресторана . Напишите
класс IceCreamStand, наследующий от класса Restaurant из упражнения 9-1 (с . 165) или
упражнения 9-4 (с . 169) . Подойдет любая версия класса; просто выберите ту, которая вам
больше нравится . Добавьте атрибут с именем flavors для хранения списка сортов мороже-
ного . Напишите метод, который выводит этот список . Создайте экземпляр IceCreamStand
и вызовите этот метод .
9-7 . Администратор: администратор — особая разновидность пользователя . Напишите
класс с именем Admin, наследующий от класса User из упражнения 9-3 (с . 165) или
упражнения 9-5 (с . 170) . Добавьте атрибут privileges для хранения списка строк вида
«разрешено добавлять сообщения», «разрешено удалять пользователей», «разрешено
банить пользователей» и т . д . Напишите метод show_privileges() для вывода набора
привилегий администратора . Создайте экземпляр Admin и вызовите свой метод .
9-8 . Привилегии: напишите класс Privileges . Класс должен содержать всего один атрибут
privileges со списком строк из упражнения 9-7 . Переместите метод show_privileges() в этот
класс . Создайте экземпляр Privileges как атрибут класса Admin . Создайте новый экземпляр
Admin и используйте свой метод для вывода списка привилегий .
9-9 . Обновление аккумулятора: используйте окончательную версию программы
electric_car .py из этого раздела . Добавьте в класс Battery метод с именем upgrade_battery() .
Этот метод должен проверять размер аккумулятора и устанавливать мощность равной 85,
если она имеет другое значение . Создайте экземпляр электромобиля с аккумулятором
по умолчанию, вызовите get_range(), а затем вызовите get_range() во второй раз после
вызова upgrade_battery() . Убедитесь в том, что запас хода увеличился .
Импортирование классов
С добавлением новой функциональности в классы файлы могут стать слишком
длинными, даже при правильном использовании наследования. В соответствии
с общей философией Python файлы не должны загромождаться лишними подроб-
ностями. Для этого Python позволяет хранить классы в модулях и импортировать
нужные классы в основную программу.
Импортирование классов
177
Импортирование одного класса
Начнем с создания модуля, содержащего только класс
Car
. При этом возникает
неочевидный конфликт имен: в этой главе уже был создан файл с именем
car .py
,
но этот модуль тоже должен называться
car .py
, потому что в нем содержится
код класса
Car
. Мы решим эту проблему, сохранив класс
Car
в модуле с именем
car .py
, заменив им файл
car .py
, который использовался ранее. В дальнейшем
любой программе, использующей этот модуль, придется присвоить более кон-
кретное имя файла — например,
my_car .py
. Ниже приведен файл
car .py
с кодом
класса
Car
:
car.py
"""Класс для представления автомобиля."""
class Car():
"""Простая модель автомобиля."""
def __init__(self, make, model, year):
"""Инициализирует атрибуты описания автомобиля."""
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0
def get_descriptive_name(self):
"""Возвращает аккуратно отформатированное описание."""
long_name = str(self.year) + ' ' + self.make + ' ' + self.model
return long_name.title()
def read_odometer(self):
"""Выводит пробег машины в милях."""
print("This car has " + str(self.odometer_reading) + " miles on it.")
def update_odometer(self, mileage):
"""
Устанавливает на одометре заданное значение.
При попытке обратной подкрутки изменение отклоняется.
"""
if mileage >= self.odometer_reading:
self.odometer_reading = mileage
else:
print("You can't roll back an odometer!")
def increment_odometer(self, miles):
"""Увеличивает показания одометра с заданным приращением."""
self.odometer_reading += miles
В точке
включается строка документации уровня модуля с кратким описанием
содержимого модуля. Пишите строки документации для каждого созданного вами
модуля.
Теперь мы создадим отдельный файл с именем
my_car .py
. Этот файл импортирует
класс
Car
и создает экземпляр этого класса:
my_car.py
from car import Car
178
Достарыңызбен бөлісу: |