分数__rsub__和__rtruediv__

时间:2011-11-04 16:42:00

标签: python math fractions magic-methods

我正在尝试在我称为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 + otherreturn self * other,则会执行所需的结果。但是,只需更改运算符即可执行__rsub____rtruediv__。我该如何解决这个问题?

基本上,调用函数的代码是:

f = Fraction(2,3)
g = Fraction(4,8)
print("2 - f: ", 2 - f)
print("2 / f: ", 2 / f)

感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

首先,您需要将other转换为Fraction才能使其发挥作用:

def __rsub__(self, other):
    return Fraction(other, 1) - self

由于只有__rsub__() <{1}}的{​​{1}}才会调用other,因此我们不需要任何类型检查 - 我们只是假设它是一个整数。

您当前的Fraction实施也需要一些工作 - 如果__sub__()没有类型other,则不返回任何内容。

答案 1 :(得分:1)

因为您进行了类型检查,并在第二个操作数不是None时返回Fractionif 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