Python 运算符重载
https://www.cnblogs.com/hotbaby/p/4913363.htmlPython 运算符重载构造函数与表达式: __init__, __sub__

常见运算符重载方法methodoverloadcall__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__方法

拦截分片

索引迭代: __getitem__

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

__getattr__和__setattr__捕捉属性的的引用__getattr__拦截属性.运算符

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

__radd__处理右侧加法

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

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