我试图构建一个有理数字类,它将根据输入值执行各种算术功能,而不使用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'
答案 0 :(得分:0)
当Python在Rational
左侧看到+
时,它会使用__and__
,但如果左侧大小没有Rational
但是它在右侧,那么Python使用__radd__
。 (r
名称__radd__
表示right
)
在__add__
中,您使用的other.nom
和other.denom
在int
中不存在,因此Rational(1,2) + 1
无法正常工作。
1 + Rational(1,2)
有效,因为您在__radd__
中使用other
代替other.nom
和other. denom
您可以使用isinstance(other, int)
来识别int
并在__add__
中进行不同的计算,它将适用于Rational+int
和Rational+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))