Использование метода родительского класса в дочернем классе 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 шт):

Автор решения: Daniil Loban

Функция super() используется для предоставления доступа к методам и свойствам родительского класса. Она возвращает объект, представляющий экземпляр родительского класса, который был ранее инициирован в конструкторе дочернего класса.

Таким образом, свойство родительского класса square можно прочитать таким образом :

super().square

Что касается ООП и двух классов Треугольник и Пирамида, то я бы выбрал ассоциацию.

Ассоциация – это когда один класс включает в себя другой класс в качестве одного из полей.

Таким образом в конструкторе Пирамиды можно завести свойство, которое будет использоваться для вычисления площади, если площадь не будет изменятся, если она будет изменятся то не забывать обновлять и это поле.

Наследование используют в тех случаях когда хотят расширить класс новыми методами и свойствами или переопределить некоторые методы. Т.е. в данном случае связь между Треугольником и Пирамидой действительно плохо прослеживается. Классическим примером тут будут классы Круг, Треугольник, Квадрат базовым классом для которых будет Фигура

→ Ссылка
Автор решения: Roman-Stop RU aggression in UA

Как правильно уже отметили в комментариях, пирамида не является треугольником. Следовательно класс пирамиды неправильно наследовать от треугольника.

То что вы хотите использовать готовый функционал вычисления площади треугольника - это правильно, вот только неправильно для этого использовать наследование.

Правильно будет испольльзовать класс 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
→ Ссылка