【Python】面向对象的运算符重载

mieleizhi0 2019-11-07

面向对象的编程中可以对运算符进行重载,使运算符可以对该类的实例进行操作。

重载方法的一般格式如下:

1 def __运算符名__(self, other):
2   运算符语句

比较常用的运算符重载有三类:二元算术运算符重载、反向算术运算符重载、比较运算符重载、一元运算符重载

二元算术运算符的重载:
方法名                  运算符和表达式      说明
__add__(self,rhs)        self + rhs      加法
__sub__(self,rhs)        self - rhs      减法
__mul__(self,rhs)        self * rhs      乘法
__truediv__(self,rhs)   self / rhs       除法
__floordiv__(self,rhs)  self //rhs       整除
__mod__(self,rhs)       self % rhs       取模
__pow__(self,rhs)       self **rhs       幂运算*rhs的含义是right hand side
反向算术运算符的重载:  当运算符的左侧为Python的内建数据类型(如:int、float等),右侧为自定义的对象类型时就需要对运算符进行反向重载。
 方法名                  运算符和表达式       说明
__radd__(self,lhs)       lhs + self        加法
__rsub__(self,lhs)       lhs - self        减法
__rmul__(self,lhs)       lhs * self        乘法
__rtruediv__(self,lhs)   lhs / self        除法
__rfloordiv__(self,lhs)  lhs // self       整除
__rmod__(self,lhs)       lhs % self        取模
__rpow__(self,lhs)       lhs ** self       幂运算*lhs的含义是left hand side*可见反向算术运算符的符号名就是普通运算符加上r(reverse)
比较算术运算符的重载:
方法名                  运算符和表达式      说明
__lt__(self,rhs)       self < rhs        小于
__le__(self,rhs)       self <= rhs       小于等于
__gt__(self,rhs)       self > rhs        大于
__ge__(self,rhs)       self >= rhs       大于等于
__eq__(self,rhs)       self == rhs       等于
__ne__(self,rhs)       self != rhs       不等于
一元运算符的重载
方法名              运算符和表达式        说明
__neg__(self)         - self           负号
__pos__(self)         + self           正号
__invert__(self)      ~ self           取反
例:    以分数类为例对运算符进行重载。
class Fraction:  # 分数类
    def __init__(self, num, deno):
        if deno < 0:
            deno = -1 * deno
            num = -1 * num
        h = hcf(num, deno)
        self.num = int(num/h)
        self.deno = int(deno/h)

    def __add__(self, other):  # 加法
        temp_lcm = lcm(self.deno, other.deno)
        num = self.num*(temp_lcm/self.deno)+other.num*(temp_lcm/other.deno)
        deno = temp_lcm
        return Fraction(num, deno)

    def __sub__(self, other):  # 减法
        temp_lcm = lcm(self.deno, other.deno)
        num = self.num * (temp_lcm / self.deno) - other.num * (temp_lcm / other.deno)
        deno = temp_lcm
        return Fraction(num, deno)

    def __mul__(self, other):  # 乘法
        return Fraction(self.num*other.num, self.deno*other.deno)

    def __truediv__(self, other):  # 除法
        return Fraction(self.num*other.deno, self.deno*other.num)

    def __rtruediv__(self, lhs):  # 反向运算符重载
        return Fraction(lhs*self.deno, self.num)

    def reverse(self):  # 取倒数
        return Fraction(self.deno, self.num)

    def prtfloat(self):  # 以浮点数形式输出
        print(format(self.num/self.deno, ‘.1f‘))

    def prt(self):  # 以分数形式输出
        print(‘{}/{}‘.format(self.num, self.deno))

参考链接:

https://blog.csdn.net/zhangshuaijun123/article/details/82149056

相关推荐