构造函数与表达式: __init__, __sub__
常见运算符重载方法
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__方法
拦截分片
索引迭代: __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__就会自动执行。