Python 中的分数和整数相乘

Multiplying Fractions and Integers in Python

我正在尝试构建一个有理数 class,它将根据输入值执行各种算术函数,而无需使用 fractions 模块。当我使用两个不同的分数时,代码工作正常,但当我尝试使用整数时,我在早期的 class 函数中遇到错误,我不确定为什么。在这一点上,我试图实现的是,再次将整数与有理数相加(例如,print Rational(1,2) * 3)。

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

编辑:我正在使用 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' 

当 Python 看到 + 左侧的 Rational 时,它使用 __and__ 但如果左侧尺寸没有 Rational 但它是在右侧然后 Python 使用 __radd__。 (r 在名字 __radd__ 中的意思是 right

__add__ 中,您使用 other.nomother.denom,它们在 int 中不存在,因此 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))