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



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


Глава 9 • Классы
Наследование в Python 2 .7
В Python 2.7 наследование реализовано немного иначе. Класс 
ElectricCar
будет 
выглядеть примерно так:
class Car(object):
def __init__(self, make, model, year):
...
class ElectricCar(Car):
def __init__(self, make, model, year):
super(ElectricCar, self).__init__(make, model, year)
...
Функция 
super()
должна получать два аргумента: ссылку на класс-потомок и объ-
ект 
self
. Эти аргументы необходимы для того, чтобы Python мог правильно связать 
родителя с потомком. Если вы используете наследование в Python 2.7, убедитесь 
в том, что родитель также определяется с синтаксисом 
object
.
Определение атрибутов и методов класса-потомка
После создания класса-потомка, наследующего от класса-родителя, можно пере-
ходить к добавлению новых атрибутов и методов, необходимых для того, чтобы 
потомок отличался от родителя.
Добавим атрибут, специфический для электромобилей (например, мощность ак-
кумулятора), и метод для вывода информации об этом атрибуте:
class Car():
...
class ElectricCar(Car):
"""Представляет аспекты машины, специфические для электромобилей."""
def __init__(self, make, model, year):
"""
Инициализирует атрибуты класса-родителя.
Затем инициализирует атрибуты, специфические для электромобиля.
"""
super().__init__(make, model, year)
 
self.battery_size = 70
 
def describe_battery(self):
"""Выводит информацию о мощности аккумулятора."""
print("This car has a " + str(self.battery_size) + "-kWh battery.")
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()
В точке 

добавляется новый атрибут 
self.battery_size
, которому присваивается 
исходное значение — скажем, 70. Этот атрибут будет присутствовать во всех экзем-
плярах, созданных на основе класса 
ElectricCar
(но не во всяком экземпляре 
Car
). 
Также добавляется метод с именем 
describe_battery()
, который выводит инфор-


Наследование
173
мацию об аккумуляторе в точке 

. При вызове этого метода выводится описание, 
которое явно относится только к электромобилям:
2016 Tesla Model S 
This car has a 70-kWh battery.
Возможности специализации класса 
ElectricCar
беспредельны. Вы можете до-
бавить сколько угодно атрибутов и методов, чтобы моделировать электромобиль 
с любой нужной точностью. Атрибуты или методы, которые могут принадлежать 
любой машине (а не только электромобилю), должны добавляться в класс 
Car
вме-
сто 
ElectricCar
. Тогда эта информация будет доступна всем пользователям класса 
Car
, а класс 
ElectricCar
будет содержать только код информации и поведения, 
специфических для электромобилей.
Переопределение методов класса-родителя
Любой метод родительского класса, который в моделируемой ситуации делает 
не то, что нужно, можно переопределить. Для этого в классе-потомке определяется 
метод с тем же именем, что и у метода класса-родителя. Python игнорирует метод 
родителя и обращает внимание только на метод, определенный в потомке.
Допустим, в классе 
Car
имеется метод 
fill_gas_tank()
. Для электромобилей за-
правка бензином бессмысленна, поэтому этот метод логично переопределить. На-
пример, это можно сделать так:
def ElectricCar(Car):
...
def fill_gas_tank():
"""У электромобилей нет бензобака."""
print("This car doesn't need a gas tank!")
И если кто-то попытается вызвать метод 
fill_gas_tank()
для электромобиля, 
Python игнорирует метод 
fill_gas_tank()
класса 
Car
и выполнит вместо него этот 
код. С применением наследования потомок сохраняет те аспекты родителя, которые 
вам нужны, и переопределяет все ненужное.
Экземпляры как атрибуты
При моделировании явлений реального мира в программах классы нередко до-
полняются все большим количеством подробностей. Списки атрибутов и мето-
дов растут, и через какое-то время файлы становятся длинными и громоздкими. 
В такой ситуации часть одного класса нередко можно записать в виде отдельного 
класса. Большой код разбивается на меньшие классы, которые работают во взаи-
модействии друг с другом.
Например, при дальнейшей доработке класса 
ElectricCar
может оказаться, что 
в нем появилось слишком много атрибутов и методов, относящихся к аккумулято-
ру. В таком случае можно остановиться и переместить все эти атрибуты и методы 
в отдельный класс с именем 
Battery
. Затем экземпляр 
Battery
становится атрибу-
том класса 
El
ectricCar
:


174

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




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

    Басты бет