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

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

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

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

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

1 二元算术运算符的重载:
2 方法名                  运算符和表达式      说明
3 __add__(self,rhs)        self + rhs      加法
4 __sub__(self,rhs)        self - rhs      减法
5 __mul__(self,rhs)        self * rhs      乘法
6 __truediv__(self,rhs)   self / rhs       除法
7 __floordiv__(self,rhs)  self //rhs       整除
8 __mod__(self,rhs)       self % rhs       取模
9 __pow__(self,rhs)       self **rhs       幂运算
*rhs的含义是right hand side
1 反向算术运算符的重载:
  当运算符的左侧为Python的内建数据类型(如:int、float等),右侧为自定义的对象类型时就需要对运算符进行反向重载。
2 方法名                  运算符和表达式       说明 3 __radd__(self,lhs)       lhs + self       加法 4 __rsub__(self,lhs)       lhs - self       减法 5 __rmul__(self,lhs)       lhs * self       乘法 6 __rtruediv__(self,lhs)   lhs / self       除法 7 __rfloordiv__(self,lhs)  lhs // self       整除 8 __rmod__(self,lhs)       lhs % self       取模 9 __rpow__(self,lhs)       lhs ** self       幂运算
*lhs的含义是left hand side
*可见反向算术运算符的符号名就是普通运算符加上r(reverse)
1 比较算术运算符的重载:
2 方法名                  运算符和表达式      说明
3 __lt__(self,rhs)       self < rhs        小于
4 __le__(self,rhs)       self <= rhs       小于等于
5 __gt__(self,rhs)       self > rhs        大于
6 __ge__(self,rhs)       self >= rhs       大于等于
7 __eq__(self,rhs)       self == rhs       等于
8 __ne__(self,rhs)       self != rhs       不等于
1 一元运算符的重载
2 方法名              运算符和表达式        说明
3 __neg__(self)         - self           负号
4 __pos__(self)         + self           正号
5 __invert__(self)      ~ self           取反
 1 例:
    以分数类为例对运算符进行重载。
2 class Fraction: # 分数类 3 def __init__(self, num, deno): 4 if deno < 0: 5 deno = -1 * deno 6 num = -1 * num 7 h = hcf(num, deno) 8 self.num = int(num/h) 9 self.deno = int(deno/h) 10 11 def __add__(self, other): # 加法 12 temp_lcm = lcm(self.deno, other.deno) 13 num = self.num*(temp_lcm/self.deno)+other.num*(temp_lcm/other.deno) 14 deno = temp_lcm 15 return Fraction(num, deno) 16 17 def __sub__(self, other): # 减法 18 temp_lcm = lcm(self.deno, other.deno) 19 num = self.num * (temp_lcm / self.deno) - other.num * (temp_lcm / other.deno) 20 deno = temp_lcm 21 return Fraction(num, deno) 22 23 def __mul__(self, other): # 乘法 24 return Fraction(self.num*other.num, self.deno*other.deno) 25 26 def __truediv__(self, other): # 除法 27 return Fraction(self.num*other.deno, self.deno*other.num) 28 29 def __rtruediv__(self, lhs): # 反向运算符重载 30 return Fraction(lhs*self.deno, self.num) 31 32 def reverse(self): # 取倒数 33 return Fraction(self.deno, self.num) 34 35 def prtfloat(self): # 以浮点数形式输出 36 print(format(self.num/self.deno, '.1f')) 37 38 def prt(self): # 以分数形式输出 39 print('{}/{}'.format(self.num, self.deno))

 

参考链接:

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

posted @ 2019-11-07 22:56  书包是笨蛋  阅读(686)  评论(0编辑  收藏  举报