python中的魔法函数以双下划线开头、结尾,不能自定义。下面介绍一些:
序号 | 名称 | 意义 | 备注 |
---|---|---|---|
(1) | __doc__ | 该函数的文档字符串,没有则为 None;不会被子类继承。 | 可写 |
(2) | __name__ | 该函数的文档字符串,没有则为 None;不会被子类继承。 | 可写 |
(3) | __qualname__ | 一个以点号分隔的名称,显示从模块的全局作用域到该模块中定义的某个类、函数或方法的“路径” | 可写 |
(4) | __module__ | 该函数所属模块(包)的名称,没有则为 None | 可写 |
(5) | __defaults__ | 由具有默认值的参数的默认参数值组成的元组,如无任何参数具有默认值则为 None。 | 可写 |
(6) | __code__ | 表示编译后的函数体的代码对象。 | 可写 |
(7) | __globals__ | 对存放该函数中全局变量的字典的引用 — 函数所属模块的全局命名空间。 | 只读 |
(8) | __dict__ | 命名空间支持的函数属性。 | 可写 |
(9) | __closure__ | None 或包含该函数可用变量的绑定的单元的元组。 | 只读 |
(10) | __annotations__ | 包含参数标注的字典。字典的键是参数名,如存在返回标注则为 ‘return’。 | 可写 |
(11) | __kwdefaults__ | 仅包含关键字参数默认值的字典。 | 可写 |
(3) __qualname__
class A: class B: def test(self): pass print(A.__qualname__) # A print(A.B.__qualname__) # A.B print(A.B.test.__qualname__) # A.B.test
(5) __defaults__
class A: def test(self,id=10,name='name'): pass print(A.test.__defaults__) print(A.test.__code__) # (10, 'name') # <code object test at 0x00000224ECB6F5D0, file "E:/WorkSpacepy/leetcode/test.py", line 2>
序号 | 名称 | 意义 | 备注 |
---|---|---|---|
(1) | __new__(self) | 静态方法,调用以创建一个 cls 类的新实例,返回对象实例。返回对象之后自动调用__init__()方法,如果没有返回值,则不会调用__init__() | 相关讲解1,相关讲解2 |
(2) | __init__(self) | 在实例被创建后,如果基类有__init__()方法,则显式的调用,以确保基类部分正确的初始化 | 因为对象是由 __new__() 和 __init__() 协作构造完成的 (由 __new__() 创建,并由 __init__() 定制),所以 __init__() 返回的值只能是 None |
(3) | __del__(self) | 在实例将被销毁时调用 | del x 并不直接调用 x.__del__(), 前者会将 x 的引用计数减一,而后者仅会在 x 的引用计数变为零时被调用. |
(4) | __repr__(self) | 由内置函数repr()调用,以输出一个对象的字符串表示 | 相关讲解1,相关讲解2 |
(5) | __str__(self) | 通过 str() 以及内置函数 format() 和 print() 调用以生成一个对象的字符串表示。返回值必须为一个 字符串对象。 | 内置object会默认调用__repr__ |
(6) | __bytes__(self) | 通过内置函数bytes()调用生成一个对象的字符串表示,返回一个bytes对象 | |
(7) | __format__(self,format_spec) | 通过 format() 内置函数、扩展、格式化字符串字面值 的求值以及 str.format() 方法调用以生成一个对象的“格式化”字符串表示。 format_spec 参数为包含所需格式选项描述的字符串。 | |
(8) | __lt__(self, other) | x<y 调用 x.__lt__(y) | |
(9) | __le__(self, other) | x<=y 调用 x.__le__(y) | |
(10) | __eq__(self, other) | x==y 调用 x.__eq__(y) | |
(11) | __ne__(self, other) | x==y 调用 x.__ne__(y) | |
(12) | __gt__(self, other) | x==y 调用 x.__gt__(y) | |
(13) | __ge__(self, other) | x>=y 调用 x.__ge__(y) | |
(14) | __hash__(self, other) | 通过内置函数 hash() 调用以对哈希集的成员进行操作,属于哈希集的类型包括 set、frozenset 以及 dict。__hash__() 应该返回一个整数。 | 对象比较结果相同所需的唯一特征属性是其具有相同的哈希值 |
(15) | __bool__(self, other) | 调用此方法以实现真值检测以及内置的 bool() 操作;应该返回 False 或 True。如果未定义此方法,则会查找并调用 __len__() 并在其返回非零值时视对象的逻辑值为真。 | 如果一个类既未定义 __len__() 也未定义 __bool__() 则视其所有实例的逻辑值为真。 |
(1) __getattr__()
(2) __getattribute__()
(3) __setattr__()
(4) __delattr__()
(5) __dir__()
(6) __class__()
(7) __get__()
(8) __set__()
(9) __delete__()
(10) __set_name__()
(11) __slots__()
(12) __init_subclass___()
(13) __prepare__()
(14) __instancecheck__()
(15) __subclasscheck__()
(16) __class_getitem__()
(17) __call__()
(18) __len__()
(19) __length_hint__()
(20) __getitem__()
(21) __setitem__()
(22) __delitem__()
(23) __missing__()
(24) __iter__()
(25) __reversed__()
(26) __contains__()
(1) __add__()
(2) __sub__()
(3) __mul__()
(4) __matmul__()
(5) __truediv__()
(6) __floordiv__()
(7) __mod__()
(8) __divmod__()
(9) __pow__()
(10) __lshift__()
(11) __rshift__()
(12) __and__()
(13) __xor__()
(14) __or__()
以下表示实现具有反射操作数的二进制运算。
(1) __radd__()
(2) __rsub__()
(3) __rmul__()
(4) __rmatmul__()
(5) __rtruediv__()
(6) __rfloordiv__()
(7) __rmod__()
(8) __rdivmod__()
(9) __rpow__()
(10) __rlshift__()
(11) __rrshift__()
(12) __rand__()
(13) __rxor__()
(14) __ror__()
原地操作
(1) __iadd__()
(2) __isub__()
(3) __imul__()
(4) __imatmul__()
(5) __itruediv__()
(6) __ifloordiv__()
(7) __imod__()
(8) __idivmod__()
(9) __ipow__()
(10) __ilshift__()
(11) __irshift__()
(12) __iand__()
(13) __ixor__()
(14) __ior__()
其他
(1) __neg__()
(2) __pos__()
(3) __abs__()
(4) __invert__()
(5) __complex__()
(6) __int__()
(7) __float__()
(8) __index__()
(9) __round__()
(10) __trunc__()
(11) __floor__()
(12) __ceil__()
(1) __enter__()
(2) __exit__()
(3) __await__()
(4) __aiter__()
(5) __anext__()
(6) __aenter__()
(7) __aexit__()
参考:python文档