<p>目前,它根本做不到你想要的。您不能将m_decimal乘以任何值:由于缺少return语句,它将始终返回None:</p>
<pre><code> def __mul__ ( self, other ) :
print (type(other))
return Decimal.__mul__ ( self, other )
</code></pre>
<p>即使加入了return,您仍然不能执行D(500000)*2.2,因为浮点仍然需要在十进制之前转换为十进制。<strong>mul</strong>将接受它。同样,repr在这里也不合适:</p>
^{pr2}$
<p>我的方法是创建一个classmethod,fromfloat</p>
<pre><code> @classmethod
def fromfloat(cls, f):
return cls(str(f))
</code></pre>
<p>然后重写mul方法以检查other的类型,并运行m_十进制.fromfloat()如果是浮点数:</p>
<pre><code>class m_Decimal(Decimal):
@classmethod
def fromfloat(cls, f):
return cls(str(f))
def __mul__(self, other):
if isinstance(other, float):
other = m_Decimal.fromfloat(other)
return Decimal.__mul__(self,other)
</code></pre>
<p>然后它会像你期望的那样工作。我个人不会重写新方法,因为使用fromfloat()方法对我来说似乎更简洁。但这只是我的看法。在</p>
<p>正如德克所说,您不需要担心转换,因为isinstance可以处理子类。您可能遇到的唯一问题是Decimal*m_Decimal将返回一个十进制值,而不是您的子类:</p>
<pre><code>>>> Decimal(2) * m_Decimal(2) * 2.2
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
Decimal(2) * m_Decimal(2) * 2.2
TypeError: unsupported operand type(s) for *: 'Decimal' and 'float'
</code></pre>
<p>有两种方法可以解决这个问题。首先,将显式转换添加到m_Decimal的mul magicmethod:</p>
<pre><code> def __mul__(self, other):
if isinstance(other, float):
other = m_Decimal.fromfloat(other)
return m_Decimal(Decimal.__mul__(self,other))
</code></pre>
<p>另一种方法,我可能不推荐,是“Monkeypatch”十进制模块:</p>
<pre><code>decimal._Decimal = decimal.Decimal
decimal.Decimal = m_Decimal
</code></pre>