添加同级类时如何使运算符重载正常工作? 定义这是什么意思?为什么 assert 失败?

问题描述

例如,假设代码库包含以下类。实例表示可以相乘的复数:

class Complex:
    def __init__(self,re,im):
        self.re,self.im = re,im
    def __mul__(lhs,rhs):
        if isinstance(rhs,Complex): return Complex(...)
        return NotImplemented

assert type(Complex(0,0) * Complex(0,0)) is Complex

实数是复数的一种特例,因此代码库还包含它们的子类:

class Real(Complex):
    def __init__(self,re):
        self.re,0
    def __mul__(lhs,Real): return Real(...)
        if isinstance(rhs,Complex): return Complex(...)
        return NotImplemented
    def __rmul__(rhs,lhs):
        if isinstance(lhs,Complex): return Complex(...)
        return NotImplemented

assert type(Real(0) * Real(0)) is Real
assert type(Real(0) * Complex(0,0)) is Complex
assert type(Complex(0,0) * Real(0)) is Complex

我相信以上都是惯用的 Python,而且一切正常。现在假设我想为现有代码添加一个虚数类。 ImaginaryComplex 的子类和 Real 的兄弟类:

class Imaginary(Complex):
    def __init__(self,self.im = 0,Imaginary): return Real(...)
        if isinstance(rhs,Real): return Imaginary(...)
        if isinstance(rhs,Real): return Imaginary(...)
        if isinstance(lhs,Complex): return Complex(...)
        return NotImplemented

assert type(Imaginary(0) * Imaginary(0)) is Real
assert type(Imaginary(0) * Real(0)) is Imaginary
assert type(Imaginary(0) * Complex(0,0)) is Complex
assert type(Real(0) * Imaginary(0)) is Imaginary  # AssertionError
assert type(Complex(0,0) * Imaginary(0)) is Complex

不幸的是,这些断言之一失败了。 type(Real(0) * Imaginary(0))Complex 而不是 Imaginary,因为 Python 通过调用 Real.__mul__ 而不是 Imaginary.__rmul__ 来执行乘法。

有没有办法编写 Imaginary 以便重载运算符都按预期工作,而无需修改 ComplexReal

还是应该将 ComplexReal 写成不同的方式才能使其工作(不需要他们了解 Imaginary)?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)