Использование метода родительского класса в дочернем классе Python
Предположим есть два класса: Triangle вычисляет площадь равнобедренного треугольника и Pyramid, который, пользуясь возвратом вычисления, вычисляет площадь пирамиды.
import math
class Triangle:
def __init__(self, a, h):
self.figure_name = "Треугольник"
self.a = a
self.h = h
@property
def square(self):
return 0.5 * self.a * self.h
class Pyramid(Triangle):
def __init__(self, a, h):
super().__init__(a, h)
self.figure_name = 'Пирамида'
@property
def square(self):
side_square = 4 * super().square
base_square = self.a ** 2
return side_square + base_square
p = Pyramid(6, 4)
print(p.square)
Название метода одинаковое в обоих классах. Как все-таки получить результат вычисления Triangle.square в методе square класса Pyramid, пользуясь наследованием, а не таким некрасивым способом? Может какой-то декоратор поможет ?
Ответы (2 шт):
Функция super() используется для предоставления доступа к методам и свойствам родительского класса. Она возвращает объект, представляющий экземпляр родительского класса, который был ранее инициирован в конструкторе дочернего класса.
Таким образом, свойство родительского класса square можно прочитать
таким образом :
super().square
Что касается ООП и двух классов Треугольник и Пирамида, то я бы выбрал ассоциацию.
Ассоциация – это когда один класс включает в себя другой класс в качестве одного из полей.
Таким образом в конструкторе Пирамиды можно завести свойство, которое будет использоваться для вычисления площади, если площадь не будет изменятся, если она будет изменятся то не забывать обновлять и это поле.
Наследование используют в тех случаях когда хотят расширить класс новыми методами и свойствами или переопределить некоторые методы. Т.е. в данном случае связь между Треугольником и Пирамидой действительно плохо прослеживается. Классическим примером тут будут классы Круг, Треугольник, Квадрат базовым классом для которых будет Фигура
Как правильно уже отметили в комментариях, пирамида не является треугольником. Следовательно класс пирамиды неправильно наследовать от треугольника.
То что вы хотите использовать готовый функционал вычисления площади треугольника - это правильно, вот только неправильно для этого использовать наследование.
Правильно будет испольльзовать класс Triangle без наследования:
class Pyramid:
def __init__(self, a, h):
self.a = a
self.h = h
self.figure_name = "Пирамида"
@property
def square(self):
side_square = 4 * Triangle(self.a, self.h).square
base_square = self.a ** 2
return side_square + base_square