2015-07-21 93 views
-4

我不知道我在做什么错我的__gt__但我没有得到正确的结果。我尝试过改变事物,但我并不总是得到正确的打印输出。另外,我不太了解__radd__或如何实施它。另外一个快速的问题是,当我打印出来的时候,有时我会得到像2 0/6这样的答案,我怎么才能打印出2呢?有人可以用我的__gt__帮助我,并帮助我使用__radd__?

这里是我的代码:

class Fraction: 
    def __init__(self,top,bottom): 
     self.num = top 
     self.den = bottom 
     self.gcd = gcd(self.num, self.den) 

    def __str__(self): 
     if self.den == 0: 
      return str(0) 
     elif self.num >= self.den: 
      if self.den == 1: 
       return str(self.num) 
      else: 
       return str(self.num // self.den)+\ 
        ' '+str(self.num%self.den)+\ 
        '/'+str(self.den) 
     else: 
      return str(self.num)+"/"+str(self.den) 

    def show(self): 
     print(self.num,"/",self.den) 

    def __add__(self,otherfraction): 
     newnum = self.num*otherfraction.den + \ 
        self.den*otherfraction.num 
     newden = self.den * otherfraction.den 
     common = self.gcd 
     return Fraction(newnum//common,newden//common) 

    def __sub__(self,otherfraction): 
     if self.den == 1: 
      sub = self.num - otherfraction.num 
      return sub 
     else: 
      newnum = self.num*otherfraction.den - \ 
         self.den*otherfraction.num 
      newden = self.den * otherfraction.den 
      common = self.gcd 
      return Fraction(newnum//common,newden//common) 

    def __mul__(self,otherfraction): 
     newnum = self.num*otherfraction.num 
     newden = self.den * otherfraction.den 

     return Fraction(newnum//newnum,newden//newnum) 

    def __truediv__(self,otherfraction): 
     newnum = self.num*otherfraction.den 
     newden = self.den * otherfraction.num 
     common = self.gcd 
     return Fraction(newnum//common,newden//common) 

    def __gt__(self,other): 
     if self.den == 1: 
      if self.num > other.num: 
       return self.num 
     else: 
      frac1 = self.num*other.den 
      frac2 = self.den * other.num 
      if frac1 > frac2: 
       return self.num//self.den 
      else: 
       return other.num//other.den 
    def __radd__(self, other): 
     if other == 0: 
      return self 
     else: 
      return self.__add__(other) 

    def __eq__(self, other): 
     firstnum = self.num * other.den 
     secondnum = other.num * self.den 

     return firstnum == secondnum 

def gcd(m,n): 
    while m%n != 0: 
     oldm = m 
     oldn = n 

     m = oldn 
     n = oldm%oldn 
    return n 


def main(): 

     getNum1 = int(input("Enter a numerator 1: ")) 
     getDen1 = int(input("Enter a denominator 1: ")) 

     getNum2 = int(input("Enter a numerator 2: ")) 
     getDen2 = int(input("Enter a denominator 2: ")) 

     f1 = Fraction(getNum1,getDen1) 
     f2 = Fraction(getNum2,getDen2) 

     print("[",f1,"]","[",f2,"]",sep='') 

     f3 = f1 + f2 
     print("Adding Fractions:",f3) 
     f3 = f1 - f2 
     print("Subtracting Fraction:",f3) 

     f3 = f1 * f2 

     print("Multiply Fraction:",f3) 

     f3 = f1/f2 
     print("Dividing Fraction:",f3) 

     if f1 > f2: 
      print(f1,"Greater than",f2) 
     else: 
      print(f2,"Greater than",f1) 

     if f1 == f2: 
      print("Fractions are equal") 
     else: 
      print("Fractions are not equal") 



main() 

预先感谢您的帮助!

+0

你想用'__gt __()'方法实现什么?当'self'大于'other'时,你想返回true吗? –

+0

是的,我只是试图让它返回自我,如果真或返回其他取决于哪一部分比另一部分大。 – keggy

回答

0

从评论 -

是的,我只是想,如果有真正还给自己或其他回报取决于其分数比其他更大。

好像你是误解如何__gt__()的作品,这个功能应该返回“真”(或真像值)时,自比其他的大,它应该返回False(或假像值,如0等),当self小于other。让我们把你的例子(assumming __gt__()回报价值的self“当自我是更大的,否则other价值”),当你做 -

if f1 > f2: 

这将调用__gt__()函数将返回要么自我的价值或其他的值,它们都是true之类的值,除非它们返回0,假设后者不是这种情况。这总是会导致f1被认为更大,因为您正在返回值(其值为True),而不是True或“False”。

你应该返回类似 -

def __gt__(self,other): 
    if self.num/self.den > other.num/other.den: 
     return True 
    else: 
     return False 

另外,关于radd -

__radd__是反向加。当Python试图评估x + y时,它首先尝试调用x.__add__(y)。如果失败,则回落至y.__radd__(x)

这种过度的对象列表评估sum()时是非常有用的,我相信在sum()第一次调用实际上是__radd__()一个电话,你可以看看这个here。哪里__radd__()进入图片

例子,假设你正在做的 -

>>> 0 + f1 # where f1 is your object. 

这将最终调用f1.__radd__(0)

这是sum()的情况,因为sum()以初始值0开始,并开始逐个向列表中添加元素。

+0

好的,谢谢,这对于_____有意义,但我仍然不明白我将如何use_radd__这个程序,因为我不认为评估sum()。对不起,这只是让我感到困惑。 – keggy

+0

请检查我的最新答案,如果它仍不清楚,请告诉我。 –

+0

好吧,有点有道理,但我只是不明白我想在我的程序中总结(),就像我没有看到我假设在程序中使用这个对不起,因为感到疼痛 – keggy

相关问题