как использовать super().__добавить__ в производный класс

#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