#python #inheritance #operator-overloading
Вопрос:
Мой код работает, но я не уверен, что это правильный способ его реализации. Я пытаюсь использовать метод «добавить» базового класса в производном классе. super().__add__
возвращает базовый класс, поэтому я должен каким-то образом «преобразовать» класс обратно в производный тип, прежде чем возвращать его. Не могли бы вы, пожалуйста, взглянуть и сказать мне, есть ли лучший/ более приятный способ реализовать это?
class a:
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self):
return f"{self.x} {self.y}"
def __add__(self, other):
return a(self.x other.x, self.y other.y)
class b(a):
def __init__(self, x, y, z):
super().__init__(x, y)
self.z = z
def __repr__(self):
str = super().__repr__()
return str f" {self.z}"
def __add__(self, other):
temp = super().__add__(other)
new_z = self.z other.z
return b(temp.x, temp.y, new_z)
Спасибо!
LI
Комментарии:
1.
b
скорееa
всего, это вообще не должно быть подклассом. Чтоa(1, 2) b(1, 2, 3)
вернется? О чемb(1, 2, 3) a(1, 2)
?
Ответ №1:
Вы можете сделать конструктор класса b
совместимым с конструктором базового класса, сделав дополнительный параметр z
необязательным со значением по умолчанию:
class b(a):
def __init__(self, x, y, z=0):
super().__init__(x, y)
self.z = z
таким образом, __add__
метод базового класса может создавать экземпляр нового объекта по типу self
объекта, а не жестко заданного класса:
class a:
def __add__(self, other):
return type(self)(self.x other.x, self.y other.y)
и что __add__
метод производного класса может изменять объект, возвращаемый __add__
методом базового класса непосредственно перед его возвращением:
def __add__(self, other):
temp = super().__add__(other)
temp.z = self.z other.z
return temp
Демо: https://replit.com/@blhsing/UnusedDraftyPortablesoftware