我正在尝试在我称为Fraction的类中使用__rsub__
函数。
这是Fraction类代码:
def __init__(self, num, denom):
''' Creates a new Fraction object num/denom'''
self.num = num
self.denom = denom
self.reduce()
def __repr__(self):
''' returns string representation of our fraction'''
return str(self.num) + "/" + str(self.denom)
def reduce(self):
''' converts our fractional representation into reduced form'''
divisor = gcd(self.num, self.denom)
self.num = self.num // divisor
self.denom = self.denom // divisor
def __sub__(self, other):
if isinstance(other,Fraction) == True:
newnum = self.num * other.denom - self.denom*other.num
newdenom = self.denom * other.denom
return Fraction(newnum, newdenom)
现在,如果我分别使用__radd__
或__rmul__
return self + other
或return self * other
,则会执行所需的结果。但是,只需更改运算符即可执行__rsub__
和__rtruediv__
。我该如何解决这个问题?
基本上,调用函数的代码是:
f = Fraction(2,3)
g = Fraction(4,8)
print("2 - f: ", 2 - f)
print("2 / f: ", 2 / f)
感谢您的帮助!
答案 0 :(得分:3)
首先,您需要将other
转换为Fraction
才能使其发挥作用:
def __rsub__(self, other):
return Fraction(other, 1) - self
由于只有__rsub__()
<{1}}的{{1}}才会调用other
,因此我们不需要任何类型检查 - 我们只是假设它是一个整数。
您当前的Fraction
实施也需要一些工作 - 如果__sub__()
没有类型other
,则不返回任何内容。
答案 1 :(得分:1)
因为您进行了类型检查,并在第二个操作数不是None
时返回Fraction
(if isinstance(...):
,而不是if isinstance(...) == True:
)。你需要强迫论证。
答案 2 :(得分:0)
实现“r”操作的常用方法是1)检查以确保其他是您知道如何处理的类型2)如果不是,则返回NotImplemented,以及3)如果是,转换为与自我交互的类型:
def __radd__(self, other):
if not instance(other, (int, Fraction):
return NotImplemented
converted = Fraction(other)
return converted + self