1

我正在尝试__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)

谢谢你的帮助!

4

3 回答 3

3

您首先需要转换other为 aFraction才能使这项工作:

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

因为只有在不是type__rsub__()时才被调用other,所以我们不需要任何类型检查——我们只是假设它是一个整数。Fraction

您当前的实现__sub__()还需要一些工作 - 如果other没有 type ,它不会返回任何内容Fraction

于 2011-11-04T16:46:40.533 回答
1

因为您进行类型检查,并None在第二个操作数不是Fraction(也if isinstance(...):,,不是if isinstance(...) == True:)时返回。您需要强制论证。

于 2011-11-04T16:47:41.490 回答
0

实现“r”操作的常用方法是 1) 检查以确保other是您知道如何处理的类型 2) 如果不是,则返回 NotImplemented,以及 3) 如果是,则转换为可以与 self 交互的类型:

def __radd__(self, other):
    if not instance(other, (int, Fraction):
        return NotImplemented
    converted = Fraction(other)
    return converted + self
于 2011-11-04T16:52:27.260 回答