Python运算符重载

Python运算符重载教程

运算符重载是让自定义的 生成的 对象(实例) 能够使用 运算符 进行操作,就像 Python 中的 字符串 类型支持直接做加法实现字符串的 拼接 的功能,列表元祖 等可以直接使用减法实现求 差集 的功能等。

这些类型能够使用运算符直接操作,都是实现了运算符的重载。

Python运算符重载作用

Python运算符重载可以让自定义的实例像内建对象一样进行运算符操作,从而让程序简洁易读,同时也可以对自定义对象将运算符赋予新的规则。

Python 常见算术运算符重载列表

方法名 运算符和表达式 说明
__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 幂运算

Python常见运算符重载列表

重载运算符 含义
__new__ 创建类,在 init 之前创建对象
__init__ 类的构造函数,其功能是创建类对象时做初始化工作。
__del__ 析构函数,其功能是销毁对象时进行回收资源的操作
__radd__ 当类对象 X 做类似 Y+X 的运算时,会调用此方法。
__iadd__ 重载 += 运算符,也就是说,当类对象 X 做类似 X+=Y 的操作时,会调用此方法。
__or__ “或”运算符 |,如果没有重载 ior,则在类似 X|Y、X|=Y 这样的语句中,“或”符号生效
__repr____str__ 格式转换方法,分别对应函数 repr(X)、str(X)
__call__ 函数调用,类似于 X(*args, **kwargs) 语句
__getattr__ 点号运算,用来获取类属性
__setattr__ 属性赋值语句,类似于 X.any=value
__delattr__ 删除属性,类似于 del X.any
__getattribute__ 获取属性,类似于 X.any
__getitem__ 索引运算,类似于 X[key],X[i:j]
__setitem__ 索引赋值语句,类似于 X[key], X[i:j]=sequence
__delitem__ 索引和分片删除
__get__, __set__, __delete__ 描述符属性,类似于 X.attr,X.attr=value,del X.attr
__len__ 计算长度,类似于 len(X)
__lt____gt____le____ge____eq____ne__ 比较,分别对应于 <、>、<=、>=、=、!= 运算符。
__iter____next__ 迭代环境下,生成迭代器与取下一条,类似于 I=iter(X) 和 next()
__contains__ 成员关系测试,类似于 item in X
__index__ 整数值,类似于 hex(X),bin(X),oct(X)
__enter____exit__ 在对类对象执行类似 with obj as var 的操作之前,会先调用 enter 方法,其结果会传给 var;在最终结束该操作之前,会调用 exit 方法(常用于做一些清理、扫尾的工作)

案例

重载加法和减法运算符

对自定义类 Mynumber 实现重载加法和减法运算符

print("嗨客网(www.haicoder.net)") class Mynumber: def __init__(self, v): self.data = v def __add__(self, other): v = self.data + other.data return Mynumber(v) def __sub__(self, other): v = self.data - other.data return Mynumber(v) def info(self): print("Number =", self.data) n1 = Mynumber(100) n2 = Mynumber(200) n3 = n1 + n2 n3.info() n4 = n3 - n2 n4.info()

程序运行后,控制台输出如下:

117_python运算符重载.png

我们定义了一个 Mynumber 类,接着,我们分别使用 __add__ 重载了 Mynumber 类的加法运算、使用了 __sub__ 重载了 Mynumber 类的减法运算。

最后,我们实例化了 Mynumber 类的两个对象 n1 和 n2,并直接调用两个对象的加法以及减法,实现了两个对象的加法与减法操作。

重载比较运算符

对自定义类 Mynumber 实现重载比较运算符

print("嗨客网(www.haicoder.net)") class Mynumber: def __init__(self, v): self.data = v def __lt__(self, other): return self.data - other.data def __gt__(self, other): if self.data > other.data: return True return False n1 = Mynumber(100) n2 = Mynumber(200) res = n1 > n2 print("Res =", res) res = n1 < n2 print("Res =", res)

程序运行后,控制台输出如下:

118_python运算符重载.png

我们定义了一个 Mynumber 类,接着,我们分别使用 __lt__ 重载了 Mynumber 类的小于运算、使用了 __gt__ 重载了 Mynumber 类的大于运算。

在小于运算符里面,我们直接返回两个数的差值,在大于运算符里面,我们判断,如果前面的数大于后面的数,那么返回 True,否则返回 False。

最后,我们实例化了 Mynumber 类的两个对象 n1 和 n2,并直接调用两个对象的大于比较运算符以及小于比较运算符,实现了两个对象的比较操作, 我们发现,大于运算结果返回了一个 bool 值,而小于比较结果返回了一个整数。

Python运算符重载总结

运算符重载是让自定义的类生成的对象(实例) 能够使用运算符进行操作,就像 Python 中的字符串类型支持直接做加法实现字符串的拼接的功能,列表、元祖等可以直接使用减法实现求差集的功能等。

这些类型能够使用运算符直接操作,都是实现了运算符的重载。