Python中的魔术方法大全

admin 阅读:38 2024-03-01

本文主要涵盖Python对象中的魔术方法。魔术方法是类对象中的一种特殊方法,这些方法拥有固定的参数列表和特殊的调用时机。

魔术方法以双下划线__开头,以双下划线结尾。

Python中的运算符重载通过魔术方法实现,因此可以将魔术方法分为与运算符无关的特殊方法及与运算符有关的特殊方法

与运算符无关的魔术方法

涉及到字符串与字节序列的魔术方法:

方法名参数列表调用时机返回值类型备注
__repr__self当调用repr()函数时str返回值应为重建该对象的Python表达式(如果可能),或包含其他信息的字符串<...>
__str__self当调用str()函数时str调用print()等其他函数时会隐式调用__str__(),当不存在__str__()时会自动调用__repr__()
__format__self, format_spec当调用format()函数时strobject.__format__(x, '')等价于str(x)
__bytes__self当调用bytes()函数时bytes返回值是对象的字节表示

涉及到数值类型转换的魔术方法:

方法名参数列表调用时机返回值类型备注
__bool__self调用bool()函数时bool__bool__函数没有定义时,会隐式
调用__len__,如果__len__也没有
定义,则返回True
__complex__self调用commplex()函数时complex
__int__self调用int()函数时int
__float__self调用float()函数时float
__hash__self调用hash()函数时hash()函数将__hash__()的返回值
截断到Py_ssize_t的范围内,64位系
统下Py_ssize_t为8字节;set等类
型的操作也会调用对象的__hash__
__index__self调用operator.index()或Python需要整数值时int__int____float__
__complex__没有实现时,这些函数隐式地调用__index__

集合相关操作:

方法名参数列表调用时机返回值类型备注
__len__self调用len()函数时int返回值必须为非负整数,在CPython中返回值不能超过sys.maxsize中定义的值,否则len()等函数会抛出OverflowError等异常
__getitemm__self, key使用[]运算符时(右值)key可以为合法的数组下标,也可以是反向的下标,也可以是序列的切片,该函数应在key类型不对应时抛出TypeErrorkey超出范围时抛出IndexErrorKeyError(对于映射类型)
__setitem__self, key, value使用[]运算符时(左值)Nonekey参数的取值及异常处理与__getitem__函数相同
__delitem__self, key使用del删除序列中的元素时None对于不可删除的序列或映射,无需实现该函数,其他同__getitem__
__contains__self, item使用in作为运算符时bool对于映射类型,__contains__接收的item参数对应映射的key部分而不是value部分。若没有定义该函数,Python首先通过__iter__进行查找,其次使用__getitem__进行查找

迭代器与枚举类型:

方法名参数列表调用时机返回值类型备注
__iter__self调用iter()函数或使用循环时返回值应为可迭代对象,对于可迭代对象,__iter__函数返回自身
__reversed__self调用reversed()函数时返回值应为可迭代对象,且是原序列的逆序
__next__self调用next()函数时返回可迭代对象中的下一个元素,当到达最后一个元素时抛出StopIteration

函数调用:

方法名参数列表调用时机返回值类型备注
__call__self, *args, **kwargs当对象以函数的方式被调用时定义了__call__方法的对象属于typing.Callable类型

上下文管理(with)关键词:

方法名参数列表调用时机返回值类型备注
__enter__self使用with关键词声明上下文时Any返回值分配给as关键词指明的对象
__exit__self, exc_type, exc_value, traceback离开with块时Anywith块执行过程中没有出现异常,则exc_type, exc_value, traceback参数均为None,否则exit块可以对异常进行处理

对象管理:

方法名参数列表调用时机返回值类型备注
__new__cls[, ...]创建类实例时Any__new__为静态方法且先于__init__执行,__new__的其余参数会传递给__init__。若__new__返回的类型与创建的类型不对应,则不会执行__init__
__init__self, ...初始化类实例时None若基类定义了__init__,则在子类的__init__中必须有super().__init()的显式调用
__del__self对象销毁时None当对象的引用计数减为0时,对象才可能被删除

属性管理:

方法名参数列表调用时机返回值类型备注
__getattribute__self, name使用self.name访问对象的属性时Any为避免无限递归,子类的__getattribute__方法的实现中必须包含父类的__getattribute__方法调用
__getattr__self, name使用self.name访问对象的不存在属性或__getattribute__函数抛出AttributeError异常Any__getattribute__正常执行时__getattr__不会执行
__setattr__self, name, value使用self.name设置属性的值时None当试图通过__setattr__向对象设置属性值时必须通过类型的__setattr__方法进行设置
__delattr__self, name执行del self.nameNone仅当del self.name语句有意义时,才需要实现该方法
__dir__self执行dir()函数时Sequencedir()会自动进行排序处理

与运算符有关的魔术方法

一元运算符

描述方法名运算符
取负__neg__-
取正__pos__+
绝对值__abs__abs()

比较运算符

描述方法名运算符
小于__lt__<
小于等于__le__<=
等于__eq__==
不等于__ne__!=
大于__gt__>
大于等于__ge__>=

算术运算符

描述方法名运算符
相加__add__+
相减__sub__-
相乘__mul__*
实数除__truediv__/
整数除__floordiv__//
取余__mod__%
整数除+取余__divmod__divmod()
乘方__pow__**
取整__round__round()

反向算术运算符在方法名前面加r,如__radd__。增量赋值算术运算符在方法名前面加i,如__iadd__

位运算符

描述方法名运算符
按位取反__invert__~
左移__lshift__<<
右移__rshift__>>
按位与__and__&
按位或__or__|
按位异或__xor__^

反向算术运算符在方法名前面加r,增量赋值算术运算符在方法名前面加i

声明

1、部分文章来源于网络,仅作为参考。
2、如果网站中图片和文字侵犯了您的版权,请联系1943759704@qq.com处理!