Книга «Изучаем Python»



Pdf көрінісі
бет108/266
Дата03.03.2023
өлшемі7,86 Mb.
#170986
түріКнига
1   ...   104   105   106   107   108   109   110   111   ...   266
Байланысты:
Изучаем Python. Программирование игр, визуализация данных, веб-приложения ( PDFDrive )


Глава 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

Достарыңызбен бөлісу:
1   ...   104   105   106   107   108   109   110   111   ...   266




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет