如何在 Python 中对类执行一元运算?

问题描述

我编写了一段代码,其中定义了一个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