Абстрактные классы. ООП
Создал конструктор в Родительском классе, в котором прописал значение 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 шт):
В случае, если нужно добавить дополнительную логику в конструктор, можно переопределить метод __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"