Python 运算符重载

时间:2021-07-15 23:52:27

构造函数与表达式: __init__, __sub__

Python 运算符重载

常见运算符重载方法

method overload call
__init__ 构造函数 对象创建: X = Class(args)
__del__ 析构函数 X对象收回
__add__ 云算法+ 如果没有_iadd_, X+Y, X+=Y
__or__ 运算符| 如果没有_ior_,X|Y, X|=Y
_repr__, __str__ 打印,转换 print(X),repr(X),str(X)
__call__ 函数调用 X(*args, **kwargs)
__getattr__ 点号运算 X.undefined
__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__ 索引和分片删除 del X[key],del X[i:j]
__len__ 长度 len(X),如果没有__bool__,真值测试
__bool__ 布尔测试 bool(X)
__lt__, __gt__,
__le__, __ge__,
__eq__, __ne__
特定的比较 X<Y,X>Y,X<=Y,X>=Y,
X==Y,X!=Y
注释:(lt: less than, gt: greater than,
  le: less equal, ge: greater equal,
  eq: equal, ne: not equal
__radd__ 右侧加法 other+X
__iadd__ 实地(增强的)加法 X+=Y(or else __add__)
__iter__, __next__ 迭代环境 I=iter(X), next()
__contains__ 成员关系测试 item in X(任何可迭代)
__index__ 整数值 hex(X), bin(X),  oct(X)
__enter__, __exit__ 环境管理器 with obj as var:
__get__, __set__,
__delete__
描述符属性 X.attr, X.attr=value, del X.attr
__new__ 创建 在__init__之前创建对象

索引和分片: __getitem__, __setitem__

如果在类中定义的话,则对于实例的索引运算,会自动调用__getitem__。当实例X出现X[i]这样的索引运算时,Python会自动调用__getitem__方法

Python 运算符重载

拦截分片

Python 运算符重载

索引迭代: __getitem__

Python 运算符重载

迭代器对象: __iter__,  __next__

尽管上一节__getitem__是有效的,但它是迭代退而求其次的方法。Python所有的迭代环境会有优先尝试__iter__的方法,再尝试__getitem__。

从技术角度上讲,迭代环境是通过iter去尝试寻找__iter__方法来实现,而这种方法返回一个迭代器对象。如果已经提供了,python会重复调用迭代器对象的next()方法,直到发生StopIteration异常。如果没有找到__iter__,python会使用__getitem__机制。

Python 运算符重载

__getattr__和__setattr__捕捉属性的的引用

__getattr__拦截属性.运算符

Python 运算符重载

__repr__和__str__会返回字符串表达形式

Python 运算符重载

__radd__处理右侧加法

Python 运算符重载

__call__拦截调用

当实例调用时,使用__call__方法

Python 运算符重载

__del__是析构器

当实例创建时,就会调用__init__构造方法。当实例空间被收回时,析构函数__del__就会自动执行。

Python 运算符重载