2013-05-24 4 views
1

У меня есть этот класс, который принимает целое число и долю и добавляет их вместе. Проблема, однако, в том, что функция __add__ преобразует ответ в __str__, поэтому, когда я пытаюсь распечатать __repr__ в ответ на добавленный вопрос, он просто печатает str ответа.Фракции класса класса Python

from fractions import Fraction 

class MixedNumber(object): 
    def __init__(self, whole_number, fraction): 
     self.whole_number = whole_number 
     self.fraction = fraction 

    def __repr__(self): 
     return "MixedNumber({}, Fraction({}, {})".format(self.whole_number, self.fraction.numerator, self.fraction.denominator) 

    def __add__(self, g): 
     summed = 0 
     for v in (self.whole_number, g.whole_number, self.fraction, g.fraction): 
      summed = Fraction(summed.numerator * v.denominator + 
          v.numerator * summed.denominator, 
          summed.denominator * v.denominator) 
     whole = summed.numerator // summed.denominator 
     remainder = Fraction(summed.numerator * whole.denominator - 
        whole.numerator * summed.denominator, 
        summed.denominator * whole.denominator) 
     return '{} and {}'.format(whole,remainder) 

if __name__=='__main__': 
    x = MixedNumber(3, Fraction(1, 3)) 
    y = MixedNumber(-1, Fraction(2, 5)) 
    z = x + y 
    print(z) 
print(z.__repr__()) 

Например: Выход на это

2 and 11/15 
'2 and 11/15' 

Когда это должно быть

2 and 11/15 
MixedNumber(2, Fraction(11, 15)) 

Любая помощь решению этой проблемы была бы оценена.

ответ

6

Возвращает новый экземпляр MixedNumber вместо:

return MixedNumber(whole, remainder) 

или, чтобы сделать его более подклассу людей, из type(self):

return type(self)(whole, remainder) 

Теперь ваш код печатает:

>>> x = MixedNumber(3, Fraction(1, 3)) 
>>> y = MixedNumber(-1, Fraction(2, 5)) 
>>> z = x + y 
>>> print z 
MixedNumber(2, Fraction(11, 15) 
>>> print repr(z) 
MixedNumber(2, Fraction(11, 15) 

, но вы можете распечатать старый результат __add__ explic itly:

>>> print '{} and {}'.format(z.whole_number, z.fraction) 
2 and 11/15 

Вы могли бы сделать, что ваш __str__ метод:

def __str__(self): 
    return '{} and {}'.format(z.whole_number, z.fraction) 

, после чего ваши print заявления будет:

>>> print z 
2 and 11/15 
>>> print repr(z) 
MixedNumber(2, Fraction(11, 15) 
+0

ОП может также добавить '__str__' метод, который возвращает '' {} и {} '. format (self.whole_number, self.fraction) ', так что' print z' будет показывать '2 и 11/15', а' print repr (z) 'будет показывать' MixedNumber (2 , Фракция (11, 15)). – SethMMorton

+0

Похоже, что закрывающая скобка отсутствует в выводах «print» в вашем примере. Это ничего не меняет, а просто наблюдает. – SethMMorton

+0

@SethMMorton: * оригинал * '__repr__' отсутствует закрывающая скобка, да. –

Смежные вопросы