赞
赏
运算符重载是让自定义的 类 生成的 对象(实例) 能够使用 运算符 进行操作,就像 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 | 幂运算 |
重载运算符 | 含义 |
---|---|
__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()
程序运行后,控制台输出如下:
我们定义了一个 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)
程序运行后,控制台输出如下:
我们定义了一个 Mynumber 类,接着,我们分别使用 __lt__
重载了 Mynumber 类的小于运算、使用了 __gt__
重载了 Mynumber 类的大于运算。
在小于运算符里面,我们直接返回两个数的差值,在大于运算符里面,我们判断,如果前面的数大于后面的数,那么返回 True,否则返回 False。
最后,我们实例化了 Mynumber 类的两个对象 n1 和 n2,并直接调用两个对象的大于比较运算符以及小于比较运算符,实现了两个对象的比较操作, 我们发现,大于运算结果返回了一个 bool 值,而小于比较结果返回了一个整数。
运算符重载是让自定义的类生成的对象(实例) 能够使用运算符进行操作,就像 Python 中的字符串类型支持直接做加法实现字符串的拼接的功能,列表、元祖等可以直接使用减法实现求差集的功能等。
这些类型能够使用运算符直接操作,都是实现了运算符的重载。