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.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))
我正在尝试构建一个有理数 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.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))