Python类添加分数

use*_*517 1 python class fractions

我有这个类,它需要一个整数和一个分数,并将它们加在一起.然而,问题在于,__add__此处的函数将答案转换为a __str__,当我尝试__repr__将答案打印到添加的问题时,它只打印str答案.

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__())
Run Code Online (Sandbox Code Playgroud)

例如:输出到此

2 and 11/15
'2 and 11/15'
Run Code Online (Sandbox Code Playgroud)

什么时候应该

2 and 11/15
MixedNumber(2, Fraction(11, 15))
Run Code Online (Sandbox Code Playgroud)

任何帮助解决这个问题将非常感激.

Mar*_*ers 6

返回一个新的实例MixedNumber:

return MixedNumber(whole, remainder)
Run Code Online (Sandbox Code Playgroud)

或者,为了使其更加亚类友好,type(self):

return type(self)(whole, remainder)
Run Code Online (Sandbox Code Playgroud)

现在您的代码打印:

>>> 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)
Run Code Online (Sandbox Code Playgroud)

但你可以__add__明确打印旧的结果:

>>> print '{} and {}'.format(z.whole_number, z.fraction)
2 and 11/15
Run Code Online (Sandbox Code Playgroud)

你可以做出你的__str__方法:

def __str__(self):
    return '{} and {}'.format(z.whole_number, z.fraction)
Run Code Online (Sandbox Code Playgroud)

之后您的print陈述将是:

>>> print z
2 and 11/15
>>> print repr(z)
MixedNumber(2, Fraction(11, 15)
Run Code Online (Sandbox Code Playgroud)