问题描述
我编写了一段代码,其中定义了一个类 Fraction
。在整个代码中,可以执行所有二进制操作,例如 +,-,/,*
。现在我还希望能够为类 Fraction
执行一元运算,例如 abs()
等。但是,目前这不起作用,例如执行一元运算 {{1}我得到一个abs()
:abs () 的错误操作数类型:'分数'。下面是纯粹处理分数减法的部分代码,它代表了整个代码:
TypeError
我想要的是,当我给出语句 def gcd(denominator,numerator):
if numerator == 0:
return denominator
else:
return gcd(numerator,(denominator % numerator))
class Fraction:
def __init__(self,numerator = 0,denominator = 1):
self.numerator = int(numerator / gcd(abs(denominator),abs(numerator) ))
self.denominator = int(denominator / gcd(abs(denominator),abs(numerator) ))
if self.denominator < 0:
self.denominator = abs(self.denominator)
self.numerator = -1*self.numerator
elif self.denominator == 0:
raise ZeroDivisionError
def __str__(self):
if self.denominator == 1:
return str(self.numerator)
else:
return str(self.numerator) + "/" + str(self.denominator)
def __neg__(self):
return Fraction(-self.numerator,self.denominator)
def __rsub__(self,other):
return self.__sub__(other)
def __sub__(self,other):
if type(other) == int:
other = Fraction(other,1)
return self.sub(other)
else:
return self.sub(other)
def sub(self,other):
result = Fraction()
result.numerator = other.denominator * self.numerator - self.denominator * other.numerator
result.denominator = other.denominator * self.denominator
multiple = gcd(result.denominator,result.numerator)
result.numerator = int(result.numerator / multiple)
result.denominator = int(result.denominator / multiple)
if result.denominator < 0:
result.denominator = abs(result.denominator)
result.numerator = 0 - result.numerator
return result
else:
return result
return result
p = Fraction(2,3)
q = Fraction(4,5)
r = (p - q)
时,输出是绝对值的分数。所以在 p = Fraction(2,3)、q = Fraction(4,5) 和 r = (p - q) 的例子中>.然后语句 print(abs(r))
给出输出 -2/15,语句 print(r)
给出输出 2/15。或者例如 print(abs(r))
给出输出 -0.133333333。但是,我不断收到前面提到的 print(float(r))
。
我一直在寻找一段时间,但到目前为止我还没有找到解决方案,你知道我该如何解决这个问题吗?
提前致谢!
解决方法
正如评论中已经提到的,实现 __abs__
和 __float__
。
将此添加到您的课程中:
def __abs__(self):
return Fraction(abs(self.numerator),abs(self.denominator))
def __float__(self):
return self.numerator / self.denominator
也许
def __abs__(self):
return Fraction(abs(self.numerator),self.denominator)
已经足够了,当您的分母始终为正时。
>>> p = Fraction(2,3)
>>> q = Fraction(4,5)
>>> r = p - q
>>> print(r)
-2/15
>>> print(abs(r))
2/15
>>> print(float(r))
-0.13333333333333333