如何在派生的 class 中使用 super().__add__

how to use super().__add__ in a derived class

我的代码有效,但我不确定这是否是正确的实现方式。我正在尝试在派生 class 中使用基础 class“添加”方法。 super().__add__ returns 基数 class 因此我必须在返回之前以某种方式将 class 转换回派生类型。你能看一看并告诉我是否有更好/更好的方法来实现这个吗?

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)

谢谢! 李

您可以使 class b 的构造函数与基础 class 的构造函数兼容,方法是使附加参数 z 可选并具有默认值:

class b(a):
    def __init__(self, x, y, z=0):
        super().__init__(x, y)
        self.z = z

这样基础 class 的 __add__ 方法可以通过 self 对象的类型而不是硬编码的 class 实例化一个新对象:

class a:
    def __add__(self, other):
        return type(self)(self.x + other.x, self.y + other.y)

并且派生class的__add__方法可以在返回之前直接修改基class的__add__方法返回的对象:

def __add__(self, other):
    temp = super().__add__(other)
    temp.z = self.z + other.z
    return temp

演示:https://replit.com/@blhsing/UnusedDraftyPortablesoftware