2022年 11月 8日

Python常用特殊方法汇总

一、跟运算符无关的特殊方法

1. 实例的创建和销毁

  • __init__
    • 解释:构造方法,可调用超类的构造器。这是实例级别的方法,发生在实例创建之后,用于初始化实例,给实例添加一些属性和操作
  • __new__
    • 解释:优先于__init__被调用。这是类级别的方法,控制类生成实例的过程,然后通常返回该类的一个实例
  • __del__
    • 解释:用于销毁实例化对象,释放内存空间。注:通常情况下,python的垃圾回收机制(引用计数)会自动销毁没用的实例

2. 字符串/字节序列表示形式

  • __repr__
    • 解释:把对象用字符串的形式表达出来,默认返回值为:“类名 + object at 内存地址”,可自定义为我们想要的信息
  • __str__
    • 解释:与__repr__类似,不同的地方在于:__str__是在用str()或者用print()打印一个对象时被调用,并且返回的字符串对终端用户更友好
  • __format__
    • 解释:当字符串/字节序列对象调用format()时被调用
  • __bytes__
    • 解释:讲对象转换成二进制字节串,对应python内置函数bytes()

3. 数值转换

  • __abs__
    • 解释:对应python内置函数abs(),计算绝对值
  • __bool__
    • 解释:对应python内置函数bool(),判断值的真假。如果实例不存在__bool__方法,bool(object)将尝试调用实例的__len__方法,如果返回0,bool将返回False,否则返回True
  • __complex__
    • 解释:对应python内置函数complex(),用于创建一个值为 real + imag * j 的复数或者转化一个字符串或数为复数。如果第一个参数为字符串,则不需要指定第二个参数
  • __int__
    • 解释:对应python内置函数int(),用于将数字或字符串转换为整数。
  • __float__
    • 解释:对应python内置函数float(),用于将数字或字符串转换成浮点数。
  • __hash__
    • 解释:对应python内置函数hash(),用于获取一个对象的哈希值。
  • __index__
    • 解释:对应python内置函数index(),用于从列表中找出某个值第一个匹配项的索引位置。

4. 集合模拟

  • __len__
    • 解释:对应python内置函数len(),返回对象(字符、列表、元组等)长度或项目个数。注意:如果len(object)中的object是python的内置类型,那么Cpython会抄个近路,在调用__len__方法时,实际上会直接返回PyVarObject里面的ob_size属性,这里的PyVarObject是表示内存中长度可变的内置对象的C语言结构体,直接读取这个值的速度比调用一个方法快得多
  • __getitem__
    • 解释:如果在类中定义了这个__getitem__方法,那么这个类的实例就可以通过”实例[key]”进行取值,比如:[1,2,3][0],{‘a’:1, ‘b’:2}[‘a’]
  • __setitem__
    • 解释:如果在类中定义了这个__setitem__方法,那么这个类的实例就可以通过”实例[key]=某值”进行赋值,比如:[1,2,3][0] = 6,{‘a’:1, ‘b’:2}[‘a’] = 3
  • __delitem__
    • 解释:如果在类中定义了这个__delitem__方法,那么这个类的实例就可以通过”del 实例[key]”进行删除值,比如:del [1,2,3][0],del {‘a’:1, ‘b’:2}[‘a’]
  • __contains__
    • 解释:如果在类中定义了这个__contains__方法,那么就可以通过python的”in”运算符来判断对应的值是否存在于类实例中

5. 迭代枚举

  • __iter__
    • 解释:对应python内置函数iter(),用来生成迭代器,可以通过for循环调用next()方法
  • __reversed__
    • 解释:对应python内置函数reversed(),用来生成反向迭代器,可以通过for循环调用next()方法
  • __next__
    • 解释:对应python内置函数next(),返回迭代器的下一个项目,迭代器中必然包含__next__方法,迭代器调用for循环将自动调用next()

6. 可调用模拟

  • __call__
    • 解释:如果在类中定义了这个__call__方法,那么将使得类实例对象可以像调用普通函数那样,以”对象名()”的形式使用。

7. 上下文管理

  • __enter__和__exit__
    • 解释:实现了上下文管理协议的上下文管理器中,必然包含了__enter__和__exit__这两个方法,比如:with语句,with语句开始运行时,调用__enter__方法,with语句运行结束时,调用__exit__方法

8. 属性管理

  • __getattr__
    • 解释:对应python内置函数getattr(),用于返回一个对象属性值。当访问一个对象中不存在的属性时,会抛出异常,提示不存在这个属性。而这个异常就是__getattr__方法抛出的。我们可以自定义该方法
  • __getattribute__
    • 解释:该方法可以拦截对对象属性的所有访问企图,当属性被访问时,自动调用该方法(只适用于新式类)。因此常用于实现一些访问某属性时执行一段代码的特性。注意:直接通过类访问类属性不会调用该方法
  • __setattr__
    • 解释:对应python内置函数setattr(),在对一个实例对象的属性设置值的时候,会调用到这个方法,每个设置值的方式都会进入该方法。
  • __delattr__
    • 解释:对应python内置函数delattr(),用于删除实例对象的属性
  • __dir__
    • 解释:对应python内置函数dir(),用于获取某个实例对象拥有的所有的属性名和方法名

9. 属性描述符

  • __get__、__set__和__delete__
    • 解释:定义三个方法中的任意一个,这个对象就会被认为是一个描述符,并且可以在被作为对象属性时重载默认的行为。如果一个对象定义了__get__()和 __set__(),它被认为是一个数据描述符,只定义__get__()被认为是非数据描述符

10. 跟类相关的业务

  • __prepare__
    • 解释:该方法只在元类中有用,而且必须声明为类方法,解释器调用元类的__new__之前会先调用__prepare__,使用类定义体中的属性创建映射。该方法第一个参数是元类,随后两个参数分别是要构建的类的名称和基类组成的元组,返回值必须是映射。元类构建新类的时候,该方法的返回映射会传给__new__的最后一个参数,然后在传给__init__方法
  • __instancecheck__
    • 解释:对应python内置函数isinstance(),检测一个实例对象是否属于某个类的实例。注意:这个方法一定要定义在元类当中才有意义
  • __subclasscheck__
    • 解释:对应python内置函数issubclass(),判断一个类是不是另一个类的子类。注意:这个方法一定要定义在元类当中才有意义

二、跟运算符相关的特殊方法

1. 一元运算符

  • __neg__
    • 对应运算符:-(负号)
  • __pos__
    • 对应运算符:+(正号)
  • __abs__
    • 对应运算符:abs() (绝对值)

2. 算数运算符

  • __add__
    • 对应运算符:+(加号)
  • __sub__
    • 对应运算符:-(减号)
  • __mul__
    • 对应运算符:*(乘号)
  • __truediv__
    • 对应运算符:/(除号)
  • __floordiv__
    • 对应运算符://(地板除、整除)
  • __mod__
    • 对应运算符:%(求余)
  • __divmod__
    • 对应运算符:divmod()
  • __pow__
    • 对应运算符:**或pow()
  • __round__
    • 对应运算符:round()

3. 比较远算符

  • __lt__
    • 对应运算符:<
  • __le__
    • 对应运算符:<=
  • __eq__
    • 对应运算符:==
  • __ne__
    • 对应运算符:!=
  • __gt__
    • 对应运算符:>
  • __ge__
    • 对应运算符:>=

4. 反向算术运算符

  • __radd__
    • 对应运算符:反向+
  • __rsub__
    • 对应运算符:反向-
  • __rmul__
    • 对应运算符:反向*
  • __rtruediv__
    • 对应运算符:反向/
  • __rfloordiv__
    • 对应运算符:反向//
  • __rmod__
    • 对应运算符:反向%
  • __rdivmod__
    • 对应运算符:反向divmod()
  • __rpow__
    • 对应运算符:反向**或pow()

5. 增量赋值算数运算符

  • __iadd__
    • 对应运算符:+=
  • __isub__
    • 对应运算符:-=
  • __imul__
    • 对应运算符:*=
  • __itruediv__
    • 对应运算符:/=
  • __ifloordiv__
    • 对应运算符://=
  • __imod__
    • 对应运算符:%=
  • __ipow__
    • 对应运算符:**=

6. 位运算符

  • __invert__
    • 对应运算符:~
  • __lshift__
    • 对应运算符:<<
  • __rshift__
    • 对应运算符:>>
  • __and__
    • 对应运算符:&
  • __or__
    • 对应运算符:|
  • __xor__
    • 对应运算符:^

7. 反向位运算符

  • __rlshift__
    • 对应运算符:反向<<
  • __rrshift__
    • 对应运算符:反向>>
  • __rand__
    • 对应运算符:反向&
  • __ror__
    • 对应运算符:反向|
  • __rxor__
    • 对应运算符:反向^

8. 增量赋值位运算符

  • __ilshift__
    • 对应运算符:<<=
  • __irshift__
    • 对应运算符:>>=
  • __iand__
    • 对应运算符:&=
  • __ior__
    • 对应运算符:|=
  • __ixor__
    • 对应运算符:^=