__rsub__ и __rtruediv__ с дробями - PullRequest
1 голос
/ 04 ноября 2011

Я пытаюсь использовать функцию __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)

Спасибо за любую помощь!

Ответы [ 3 ]

3 голосов
/ 04 ноября 2011

Сначала вам нужно преобразовать other в Fraction, чтобы сделать эту работу:

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

Поскольку __rsub__() вызывается, только если other равно , а не изtype Fraction, нам не нужна проверка типов - мы просто предполагаем, что это целое число.

Ваша текущая реализация __sub__() также нуждается в некоторой работе - она ​​ничего не возвращает, если other делаетне имеют типа Fraction.

1 голос
/ 04 ноября 2011

Поскольку вы вводите проверку и возвращаете None, когда второй операнд не Fraction (также if isinstance(...):, а не if isinstance(...) == True:). Вместо этого вам нужно привести аргумент.

0 голосов
/ 04 ноября 2011

Обычный способ реализации операции "r" - это 1) проверка, чтобы убедиться, что other - это тип, который вы знаете, как обрабатывать 2) если нет, вернуть NotImplemented и 3) если это так, преобразовать относится к типу, который может взаимодействовать с самим собой:

def __radd__(self, other):
    if not instance(other, (int, Fraction):
        return NotImplemented
    converted = Fraction(other)
    return converted + self
...