问题描述
例如,假设代码库包含以下类。实例表示可以相乘的复数:
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,而且一切正常。现在假设我想为现有代码添加一个虚数类。 Imaginary
是 Complex
的子类和 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
以便重载运算符都按预期工作,而无需修改 Complex
或 Real
?
还是应该将 Complex
和 Real
写成不同的方式才能使其工作(不需要他们了解 Imaginary
)?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)