在Python中乘以分数和整数

时间:2016-10-31 02:40:05

标签: python rational-numbers

我试图构建一个有理数字类,它将根据输入值执行各种算术功能,而不使用fractions模块。当我使用两个不同的分数时,代码工作正常,但是一旦我尝试使用整数,我就会在早期的类函数中得到错误并且不确定原因。我此时试图实现的是再次向有理数添加整数(例如,print Rational(1,2) * 3)。

我已经包含了我到目前为止的代码 - 有问题的操作是__radd__,但是当我的代码中包含此代码时,我收到__add__的属性错误(此错误在包含此新操作之前不会显示)。我猜测问题来自于仍然将第二个__radd__参数作为其他参数(假设Rational类的不同情况?),但我不确定如何继续。

编辑:我使用的是Python 2.7。示例运行中的错误包含在代码下方。

def gcd(a, b):
    if b == 0:
        return a
    else:
        return gcd(b, a%b)
class Rational:
    def __init__(self, nom, denom):
        if denom == 0:
            raise ZeroDivisionError, ("Cannot divide by zero!")
        else:
            self.reduce = gcd(nom, denom)
            self.nom = nom / self.reduce
            self.denom = denom / self.reduce
    def __add__ (self, other):
        return Rational(self.nom*other.denom+other.nom*self.denom, self.denom*other.denom)        
    def __sub__ (self, other):
        return Rational(self.nom * other.denom - other.nom * self.denom,self.denom * other.denom)    
    def __mul__ (self, other):
        return Rational(self.nom * other.nom, self.denom * other.denom)
    def __div__ (self, other):
        return Rational(self.nom * other.denom, self.denom * other.nom)
    def __radd__ (self, other):
        return Rational(self.nom*1+other*self.denom, self.denom*1) 
    def __str__ (self):
        return str(self.nom) + "/" + str(self.denom)

示例错误

print Rational(1,2) + 1

AttributeError                            Traceback (most recent call last)
<ipython-input-201-1ccb1fc0dfef> in <module>()
----> 1 print Rational(1,2) + 1

C:\Users\turk\Documents\EV_HW6_P2.py in __add__(self, other)
     13             self.denom = denom / self.reduce
     14     def __add__ (self, other):
---> 15         return Rational(self.nom*other.denom+other.nom*self.denom, self.denom*other.denom)
     16     def __sub__ (self, other):
     17         return Rational(self.nom * other.denom - other.nom * self.denom,self.denom * other.denom)

AttributeError: 'int' object has no attribute 'denom' 

1 个答案:

答案 0 :(得分:0)

当Python在Rational左侧看到+时,它会使用__and__,但如果左侧大小没有Rational但是它在右侧,那么Python使用__radd__。 (r名称__radd__表示right

__add__中,您使用的other.nomother.denomint中不存在,因此Rational(1,2) + 1无法正常工作。

1 + Rational(1,2)有效,因为您在__radd__中使用other代替other.nomother. denom

您可以使用isinstance(other, int)来识别int并在__add__中进行不同的计算,它将适用于Rational+intRational+Rational

def __add__ (self, other):
    if isinstance(other, int):
        # Rational + int
        return Rational(self.nom*1+other*self.denom, self.denom*1) 
    else:
        # Rational + Rational
        return Rational(self.nom*other.denom+other.nom*self.denom, self.denom*other.denom)        

# ----

print(Rational(1,2) + 1)
print(Rational(1,2) + Rational(1,2))