Абстрактные классы. ООП

Создал конструктор в Родительском классе, в котором прописал значение size. В дочерних классах нужно значениям coat_size и suit_height сослаться на size (не знаю как это сделать). Как я понял для этого нужно использовать super().init(), но не совсем понимаю как.

from abc import abstractmethod, ABC

class Clothes(ABC):
    def __init__(self, size):
        self.size = size

    @abstractmethod
    def clothes_outgo(self):
        pass

class Coat(Clothes):
    # def __init__(self):
    #     self.coat_size = self.size
    #     super().__init__()

    @property
    def clothes_outgo(self):
        return f"{round((self.size / 6.5 + 0.5), 2)} sm^2"

class Suit(Clothes):
    # def __init__(self):
    #     self.suit_height = self.size
    #     super().__init__()

    @property
    def clothes_outgo(self):
        return f"{self.size * 2 + 0.3} sm^2"

Bob = Suit(32)
Mike = Coat(178)
print(Bob.clothes_outgo)
print(Mike.clothes_outgo)

Ответы (2 шт):

Автор решения: Bogdan

В случае, если нужно добавить дополнительную логику в конструктор, можно переопределить метод __init__(self, size) (см. класс Suit). Если же ничего дополнительного не нужно, то можно вообще не указывать конструктор. В этом случае выполнится конструктор класса Clothes (см. Coat):

class Clothes(ABC):
    def __init__(self, size):
        self.size = size

class Suit(Clothes):
    def __init__(self, size):
        super().__init__(size)
        self.size //= 2  # ! использование size после super().__init__()

class Coat(Clothes):
    pass
>>> print(Coat(32).size)
32
>>> print(Suit(178).size)
89 

Если все же прописываете конструктор у дочернего класса, то вызвать super().__init__() необходимо для инициализации полей базового класса. Если его не вызвать, то эти поля не будут проинициализированы (в вашем случае self.size).

Параметры тоже должны совпадать. Если в базовом классе прописано def __init__(self, size), то вызов тоже будет с параметром: super().__init__(size) (который можно так же пробросить в виде параметра).

А вообще в целом ничего переименовывать не обязательно. Можно без проблем использовать родительский size.

→ Ссылка
Автор решения: Фаррух

Разобрался как сделать. Как-то так:

class Coat(Clothes):
    def __init__(self, size):
        super().__init__(size)   
        self.coat_size = size

    @property
    def clothes_outgo(self):
        return f"{round((self.size / 6.5 + 0.5), 2)} sm^2"

class Suit(Clothes):
    def __init__(self, size):
        super().__init__(size)   
        self.suit_height = size

    @property
    def clothes_outgo(self):
        return f"{self.size * 2 + 0.3} sm^2"

→ Ссылка