首页 > 解决方案 > 继承重写的运算符时返回与调用相同的类型

问题描述

想象一下 Python 中的这种情况:

class A:
    def __init__(self, v):
        self.val = v

    def __add__(self, b):
        return A(self.val + b.val)

class B(A):
    def __init__(self, v):
        super().__init__(v)

很明显,B__add__从其父 A 继承了运算符覆盖。

如果我有这些对象的一些实例,并执行一些添加:

foo = A(3)
bar = B(4)
baz = B(5)

alp = foo + foo
bet = foo + bar
gam = bar + baz

alp具有A预期的类型。bet也确实如此,这可能不太出人意料,但并不奇怪。

gam但是有 type A,这很烦人,因为我们添加了两个实例B来获取它。

我的问题是:如何才能做到gam有类型B?是否需要__add__显式覆盖 B 上的每个运算符(例如 )以将结果super().__add__(b)转换为 B 的类型?或者有没有更聪明、更清洁的方法让它发挥作用?

谢谢你。

标签: pythoninheritancemethods

解决方案


而不是调用A(...)call type(self)(...)。将type(self)返回当前对象的类。


推荐阅读