1

__rsub__私が作成した Fraction というクラスで関数 を使用しようとしています。

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)

助けてくれてありがとう!

4

3 に答える 3

3

これを機能させるには、最初に に変換otherする必要があります。Fraction

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

が typeでない__rsub__()場合にのみ呼び出されるため、型チェックは必要ありません。単に整数であると仮定します。otherFraction

の現在の実装にもいくつかの作業が必要です。 type がない場合は__sub__()何も返しません。otherFraction

于 2011-11-04T16:46:40.533 に答える
1

型チェックを行いNone、第 2 オペランドがそうでない場合に返すためです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 に答える