python特殊方法解析
首先什么是特殊方法?
特殊方法从名称上看都是以双下划线开头和结尾的函数,他们通常不需要直接调用,当python解释器遇到某些句法时会调用对应的特殊方法。
比如obj[key]在python解释的时候就会调用__getitem__方法,这种常用的写法又等同于obj.__getitem__(key)。
下面是自己整理的常用的特殊方法汇总
类别 | 方法名 | 说明 | 方法名 | 说明 | ||||
字符串和字节序列 | __repr__ | 用来实现对象的合理字符串表达形式(正式,通常用于调试),当需要__str__方法,但它不存在时,python会使用此(__repr__)方法代替,返回值必须为字符串 | __str__ | 用来实现对象的非正式描述,print,format,str方法使用时会调用此方法,返回值必须为字符串 | ||||
__format__ | 通过format方法调用,重写复杂,详细参考官方文档 | __bytes__ | 通过bytes方法调用,详细参考官方文档 | |||||
数值转换 | __abs__ | 通过abs方法调用,实现绝对值的功能 | __bool__ | 通过bool方法调用,实现真值的检测或是转换,当未实现此方法时,转用len方法的返回值判定 | ||||
__complex__ | 通过complex方法调用,实现实数转化为复数的功能 | __int__ | 通过int方法调用,将参数转化为整型 | |||||
__float__ | 通过float方法调用,将参数转化为浮点型 | __hash__ | 通过hash方法调用,通过参数对哈希集操作,详细参考官方文档 | |||||
__index__ | 通过gbj.index方法调用,返回参数(容器存放内容)的下标 | |||||||
集合模拟 | __len__ | 通过len方法调用,返回对象的长度(>=0) | __getitem__ | 通过self[key]获取值,特别要注意的是参数为切片或是int型(负数) | ||||
__setitem__ | 通过self[key]赋值 | __delitem__ | 通过self[key]删除值 | |||||
__contains__ | 与in类似,优于in,无法通过别的方法调用,详细见官方文档 | |||||||
迭代 | __item__ | 此方法在需要为容器创建迭代器时被调用,返回迭代器对象, | __reversed__ | 此方法(如果存在)会被 reverse调用以实现逆向迭代 | ||||
__next__ | 迭代器调用,用来枚举下一个元素 | |||||||
上下文管理 | __enter__ | with语句会绑定这个方法知道结束,详细参考官方文档 | __exit__ | 退出关联对象上下文,有异常和无异常的处理方式参考官方文档 | ||||
实例创建初始化和销毁 | __new__ | 在实例创建时调用 | __init__ | 在创建实例成功后执行的初始化方法 | ||||
__del__ | 在实例将被销毁时调用 | |||||||
属性管理 | __getattr__ | 当默认属性访问因引发AttributeError 而失败时被调用,详细参考官方文档 | __getattribute__ | 此方法会无条件地被调用以实现对类实例属性的访问,如果还实现了__getattr__,则__getattr__不会被调用 | ||||
__setattr__ | 此方法在一个属性被尝试赋值时被调用 | __delattr__ | 此方法在一个属性被尝试删除时被调用。 | |||||
__dir__ | 此方法会在对相应对象调用 dir() 时被调用。返回值必须为一个序列,dir()会把返回的序列转换为列表并对其排序。 | |||||||
属性描述符 | __get__ | 调用此方法以获取所有者类的属性(类属性访问)或该类的实例的属性(实例属性访问) | __set__ | 调用此方法以设置 第一个参数指定的所有者类的实例的属性为新值(第二个参数)。 | ||||
__del__ | 调用此方法以删除第一个参数指定的所有者类的实例的属性 | |||||||
和运算符相关的特殊方法 | ||||||||
类别 | 方法 | 对应运算符 | 方法 | 对应运算符 | 方法 | 对应运算符 | ||
一元运算 | __neg__ | - | __pos__ | + | ||||
比较运算符 | __lt__ | < | __le__ | <= | __eq__ | == | ||
__ne__ | != | __gt__ | > | __ge__ | >= | |||
算数运算符 | __add__ | + | __sub__ | - | __mul__ | * | ||
__truediv__ | / | __floordiv__ | // | __mod__ | % | |||
__pow__ | **或pow() | __round__ | round() | |||||
增量赋值运算符 | __iadd__ | += | __isub__ | -= | __imul__ | *= | ||
__itruediv__ | /= | __ifloordiv__ | //= | __imod__ | %= | |||
位运算符 | __invert__ | ~ | __lshift__ | << | __rshift__ | >> | ||
__and__ | & | __or__ | | | __xor__ | ^ |
分类参考书籍:《流畅的python》
内容参考官方文档:https://docs.python.org/zh-cn/3.7/reference/datamodel.html#