Прошу объяснить наследование в питоне(Python)
У меня стоит задача создать класс Фигура и унаследовать от него класс Куб, который в свою очередь должен уметь считать свою площадь или периметр(неважно) по СПИСКУ ПОВЕРХНОСТЕЙ т.е. примерно так [Square, Square, Square, Square, Square, Square]
Код ниже, я не могу понять как мне объединить и вывести например значение из класса Square и вообще заставить ее работать.
Не могу сообразить какая магия должна произойти чтоб посчитать сумму этих поверхностей,
например так
summa = sum([Square, Square, Square, Square, Square, Square])
from abc import ABC,abstractmethod
class Figure(ABC):
def __init__(self, length: int) -> None:
self.length = length
@abstractmethod
def square(self):
pass
class Cube(Figure):
def __init__(self, length, height):
super().__init__(length)
self.square_cub = 0
def square(self):
self.square_cub = [Square, Square, Square, Square, Square, Square]
return sum(self.square_cub)
class Square(Figure):
@classmethod
def square(cls):
sq_obj = cls.length ** 2
return cls.sq_obj
Ответы (2 шт):
Спустя фикс кучи логических неурядиц получился вот такой пример рабочего кода.
from abc import ABC,abstractmethod
class Figure(ABC):
def __init__(self, length: int) -> None:
self.length = length
@abstractmethod
def square(self):
pass
class Square(Figure):
def square(self):
sq_obj = self.length ** 2
return sq_obj
class Cube(Figure):
def __init__(self, length):
super().__init__(length)
self.square_cub = 0
self.square_cub = [Square(length) for i in range(6)]
def square(self):
s = 0
for i in self.square_cub:
s += i.square()
return s
cube = Cube(2)
print(cube.square())
Что здесь происходит?
Сначала мы объявляем абстрактный класс Figure. Он абстрактный потому что логика одного его поля не определена, значит он может использоваться только для наследования. Наследуем от класса фигуры класс квадрата, в котором доопределяем абстрактный метод. Такой класс можно использовать.
@classmethod используется для получения первым аргументом ссылки не на объект, а на класс. Но логика у вас была написана очевидна относящаяся к объекту.
Потом мы определяем класс куба и тоже наследуем его от фигуры. И тоже переопределяем метод получения площади.
У вас был список заполненный 6 классами квадратов, а не объектами квадратов.
Из геометрических соображений - куб определяется одной величиной - размером грани. Делаем соответсвующие вычисления. Советую почитать больше об ООП в python на https://younglinux.info/oopython/course
Для получения суммы используйте магический метод radd:
from abc import ABC,abstractmethod
class Figure(ABC):
def __init__(self, length: int) -> None:
self.length = length
@abstractmethod
def square(self) -> int:
pass
def __radd__(self, s: int) -> int:
return self.square() + s
class Square(Figure):
def square(self) -> int:
return self.length ** 2
class Cube(Figure):
def square(self) -> int:
return Square(self.length).square() * 6
summa = sum([Square(4), Square(3)])
print(summa) # 25
summa = sum([Cube(2), Cube(1), Square(5)])
print(summa) # 55