В этой части учебника вы прочитаете ООП наследование в Python, это пожалуй одна из самых важных тем в ООП программирование.
Python ООП наследование:
Для того чтобы реализовать в Python наследование, нужно просто в скобках указать класс, от которого вы наследуете.
Вот вам сразу же наглядный пример наследования:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | # Базовый класс Car class Car: # Конструктор класса def __init__(self, marka, speed): # Назначаем свойство marka self.marka = marka # Назначаем свойство speed self.speed = speed # Выводим свойства через метод show_properties() self.show_properties() # Создаём метод show_properties() def show_properties(self): # Выводим свойство marka print(self.marka) # Выводим свойство speed print(self.speed) # Создаём класс Truck class Truck(Car): # Создаём метод shipment def shipment(self): # Выводим текст "Погрузка товаров" print("Погрузка товаров") def main(): # Создаём объект класса Truck truct = Truck(marka="BMV", speed=200) # Вызываем метод shipment() truct.shipment() |
Здесь в начале мы создаём класс Car
, от которого будем наследовать класс Truck
, я не буду описывать его работу, так как это делали в предыдущих частях, если чего то не понимаете, то посмотрите их.
Потом создаём класс Truck
, который унаследовали от класса Car
, и в нём создаём метод shipment()
, который выводит в терминал текст «Погрузка товаров».
Последние создаём объект truct
, класса Truck
, и можете заметить что при создание, мы назначаем такие же атрибуты, как и если бы мы создавали объект от класса Car
.
Так происходит благодаря тому, что мы унаследовали Truck
от Car
, а дочерний класс он имеет все свойства и методы родительского, даже конструктор.
После мы вызываем метод shipment()
, и вот что должно вывестись в консоль:
Как видите в начале у нас сработал конструктор как в Car
, вывел свойства, потом мы уже вызвали метод shipment()
, и он вывел надпись.
Примечание:
Если вы попробуете вызвать метод shipment()
, но в используя объект класса Car
, то у вас будет ошибка, так как этого метода нет в этом классе.
Наследование конструктора Python:
Проблема прошлой программы в том, что мы не наследуем конструктор, что если нам надо добавить новое свойство, и при этом полностью его не переписывать.
Для этого вы можете унаследовать конструктор родительского класса, через функцию super()
.
Вот как это делается:
1 2 3 4 5 6 7 8 9 10 11 12 13 | # Создаём конструктор для класса Truck def __init__(self, marka, speed, lifting_capacity): # Наследуем конструктор от родителя Car super().__init__(marka, speed) # Назначаем свойство lifting_capacity self.lifting_capacity = lifting_capacity # Дополняем метод show_properties() def show_properties(self): # Вызываем метод show_properties() от родителя super().show_properties() # Выводим значение свойства lifting_capacity print(self.lifting_capacity) |
Тут мы передаём в конструктор все атрибуты для конструктора родителя и для нового нашего свойства lifting_capacity
, которое отвечает за грузоподъёмность.
Для вызова конструктора Car
, мы используем super()
, как вы тоже можете заметить.
Также похожем образом мы дополняем метод show_properties()
, для класса Truck
, мы там также вызываем метод родителя и еще выводим новое свойство.
Ещё надо немного изменить что main()
:
1 2 3 4 5 6 7 | def main(): # Создаём объект класса Truck truct = Truck(marka="BMV", speed=200, lifting_capacity=1000) # Вызываем метод show_properties() которое выводит свойства truct.show_properties() # Вызываем метод shipment() которое выводит текст "Погрузка товаров" truct.shipment() |
Вы наверное уже заметили, что тут мы добавили при создание ещё один атрибут, это как раз тот, которым мы назначаем свойство lifting_capacity
, после мы вызываем методы show_properties()
и shipment()
.
Важно:
Нужно ещё обязательно убрать из конструктора родителя Car
, вызов метода show_properties()
, так как, там нету свойства lifting_capacity
, из-за этого может возникнуть ошибка.
Вот что у нас в итоге должно вывестись в консоль:
Всё вывелось как надо, если же вам не надо дополнять родительский метод, а просто хотите его изменить полностью, то тогда не используете super()
и впишите в него чего нужно.
Вывод:
В этой части учебника вы прочитали про ООП наследование в Python, думаю вам было очень полезно, также это не единственная часть про это, будет ещё много, так как эта тема очень обширная, тут были только основы.