使用特殊方法

特殊方法是让python调用的

唯一例外的可能是__init__方法(在子类中调用超类的__init__)

通过内置函数(例如 len、 iter、 str, 等等)使用特殊方法,如果是内置对象会更快

不要随意添加特殊方法 有可能以后会被Python使用

常用的特殊方法

__init__

初始化构造方法 创建对象调用

__len__

len() 方法调用

如果是 Python 内置的类型, 比如列表(list) 、 字符串(str) 、 字节序列
(bytearray) 等, 那么 CPython 会抄个近路, len 实际上会直接返回
PyVarObject 里的 ob_size 属性。 PyVarObject 是表示内存中长度可变的内置对象的 C
语言结构体。 直接读取这个值比调用一个方法要快很多。

__getitem__

返回序列可以进行切片(slicing)、迭代操作

random.choice 可以随机取值

reversed 排序

sorted

__str__和___rerp__

print(a) 调用的是a的__str__方法
在python解释器里直接敲a后回车,调用的是a.__repr__()

如果没有定义__str__() __str__=__repr__()

__bool__方法

bool(x) 的背后是调用 x.__bool__() 的结果; 如果不存在__bool__ 方法, 那么 bool(x) 会尝试调用 x.__len__()。 若返回 0, 则 bool 会返回False; 否则返回 True。

运算符无关的特殊方法

类别 方法名
字符串 / 字节序列表示形式 __repr__、 __str__、 __format__、 __bytes__
数值转换 __abs__、 __bool__、 __complex__、 __int__、 __float__、 __hash__、 __index__
集合模拟 __len__、 __getitem__、 __setitem__、 __delitem__、 __contains__
迭代枚举 __iter__、 __reversed__、 __next__
可调用模拟 __call__
上下文管理 __enter__、 __exit__
实例创建和销毁 __new__、 __init__、 __del__
属性管理 __getattr__、 __getattribute__、 __setattr__、 __delattr__、 __dir__
属性描述符 __get__、 __set__、 __delete__
跟类相关的服务 __prepare__、 __instancecheck__、 __subclasscheck__

运算有关的操作方法

类别 方法名和对应的运算符
一元运 算符 __neg__ -、 __pos__ +、 __abs__ abs()
众多比 较运算 符 __lt__ <、 __le__ <=、 __eq__ ==、 __ne__ !=、 __gt__ >、 __ge__ >=
算术运 算符 __add__ +、 __sub__ -、 __mul__*、__truediv__、 __floordiv__ //、 __mod__ %、\ __divmod__ divmod()、 __pow__ ** 或pow()、 __round__ round()
反向算 术运算 符 __radd__、 __rsub__、 __rmul__、 __rtruediv__、 __rfloordiv__、 __rmod__、 __rdivmod__、 __rpow__
增量赋 值算术 运算符 __iadd__、 __isub__、 __imul__、 __itruediv__、 __ifloordiv__、 __imod__、 __ipow__
位运算 符 __invert__ ~、 __lshift__ <<、 __rshift__ >>、__and__ &、 __or__ |、__xor__ ^
反向位 运算符 __rlshift__、 __rrshift__、 __rand__、 __rxor__、 __ror__
增量赋 值位运 算符 __ilshift__、 __irshift__、 __iand__、 __ixor__、 __ior__