Импортирование одного класса
Начнем с создания модуля, содержащего только класс Car. При этом возникает неочевидный конфликт имен: в этой главе уже был создан файл с именем car.py, но этот модуль тоже должен называться car.py, потому что в нем содержится код класса Car. Мы решим эту проблему, сохранив класс Car в модуле с именем car.py, заменив им файл car.py, который использовался ранее. В дальнейшем любой программе, использующей этот модуль, придется присвоить более конкретное имя файла — например, my_car.py. Ниже приведен файл car.py с кодом класса Car:
car.py
(1) """Класс для представления автомобиля."""
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
В точке (1) включается строка документации уровня модуля с кратким описанием содержимого модуля. Пишите строки документации для каждого созданного вами модуля.
Теперь мы создадим отдельный файл с именем my_car.py. Этот файл импортирует класс Car и создает экземпляр этого класса:
my_car.py
(1) from car import Car
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
my_new_car.odometer_reading = 23
my_new_car.read_odometer()
Команда import в точке (1) приказывает Python открыть модуль car и импортировать класс Car. Теперь мы можем использовать класс Car так, как если бы он был определен в этом файле. Результат остается тем же, что и в предыдущей версии:
2016 Audi A4
This car has 23 miles on it.
Импортирование классов повышает эффективность программирования. Представьте, каким длинным получился бы файл этой программы, если бы в него был включен весь класс Car. Перемещая класс в модуль и импортируя этот модуль, вы получаете ту же функциональность, но основной файл программы при этом остается чистым и удобочитаемым. Бульшая часть логики также может храниться в отдельных файлах; когда ваши классы работают так, как положено, вы можете забыть об этих файлах и сосредоточиться на высокоуровневой логике основной программы.