我正在尝试实现扩展类P的类C的__ mul 方法 . 类P具有 mul __的实现,但这仅适用于该类型的元素(P()* P()) .
所以在C __ mul 中我想在参数为float时为float实现简单乘法 . 当它不是我想要使用P的 mul __ ..但这导致问题,如在P的__ mul __那是“返回P(某事)”..
所以基本上他们最初是C型的事实在一些操作之后就会丢失 .
以下代码更好地解释了该问题 .
任何想法解决这个?
class MyFloat(object):
def __init__(self, a):
self.a = a
def __mul__(self, other):
return MyFloat(self.a * other.a)
def __repr__(self):
return str(self.a)
class MyFloatExt(MyFloat):
def __init__(self, a):
MyFloat.__init__(self, a)
def __add__(self, other):
return MyFloatExt(self.a + other.a)
def __mul__(self, other):
if type(other) == (int, long, float):
return MyFloatExt(self.a * other)
else:
return MyFloat.__mul__(self, other)
a = MyFloatExt(0.5)
b = MyFloatExt(1.5)
c = a + b
print c
d = a * b
print d
e = d * c
print e
print isinstance(e, MyFloat)
f = e * 0.5
print f
2 回答
首先,您在
__mul__
中的MyFloatExt
的类型检查应该是这样的甚至更好
您还想在
MyFloat
中将__mul__
的定义更改为:所以它可以创建您的实际类型的实例
你可以更喜欢调用
super
而不是调用MyFloat.__mul__
,因为你的类型层次结构是进化的原因 .完整来源:
这里有两个问题
在
MyFloatExt
的__mul__
实现中,您永远不会检查other
是MyFloatExt
的实例isinstance(e, MyFloat)
将永远为真,因为MyFloatExt
继承自MyFloat
要解决这个问题: