淘先锋技术网

首页 1 2 3 4 5 6 7

一.什么是魔法函数

Python内置的以双下划线开头并以双下划线结尾的函数(不能自己定义,没有用),如__init__(),__str__(),__getitem()__等很多,用于实现并定制很多特性,非常灵活,且是隐式调用的。

如__getitem__()可以把类变成一个可迭代的对象(一次一次取数据,直到抛异常):

1395687-20190123153410823-593908120.png

二.Python的数据模型以及数据模型对Python的影响

魔法函数会直接影响到Python语法本身,如让类变成可迭代的对象,也会影响Python的一些内置函数的调用,如实现__len__()能对对象调用len()方法。

1395687-20190123154414466-28650127.png

三.魔法函数一览

1.非数学运算:

1.1字符串表示:__repr__,__str__

__str__:定制字符串格式化(类到字符串),__repr__类似,但是是开发模式下

1395687-20190123161716215-385966919.png

1.2集合序列相关:__len__,__getitem__,__setitem__,__delitem__,__contains__

1.3迭代相关:__iter__,__next__

1.4可调用:__call__

1.5with上下文管理器:__enter__,__exit__

1.6数值转换:__abs__,__bool__,__int__,__float__,__hash__,__index__

1.7元类相关:__new__,__init__

1.8属性相关:__getattr__、 __setattr__,__getattribute__、setattribute__,__dir__

1.9属性描述符:__get__、__set__、 __delete__

1.10协程:__await__、__aiter__、__anext__、__aenter__、__aexit__

2.数学运算:

2.1一元运算符:__neg__(-)、__pos__(+)、__abs__

自定制__abs__也影响了abs()内置方法

1395687-20190123162214674-2072970974.png

2.2二元运算符:__lt__(<)、 __le__ <= 、 __eq__ == 、 __ne__ != 、 __gt__ > 、 __ge__ >=

2.3算术运算符:__add__ + 、 __sub__ - 、 __mul__ * 、 __truediv__ / 、 __floordiv__ // 、 __mod__ % 、 __divmod__ divmod() 、 __pow__ ** 或 pow() 、 __round__ round()

1395687-20190123162726531-413270592.png

2.4反向算术运算符:__radd__ 、 __rsub__ 、 __rmul__ 、 __rtruediv__ 、 __rfloordiv__ 、 __rmod__ 、__rdivmod__ 、 __rpow__

2.5增量赋值算术运算符:__iadd__ 、 __isub__ 、 __imul__ 、 __itruediv__ 、 __ifloordiv__ 、 __imod__ 、__ipow__

2.6位运算符:__invert__ ~ 、 __lshift__ << 、 __rshift__ >> 、 __and__ & 、 __or__ | 、 __xor__ ^

2.7反向位运算符:__rlshift__ 、 __rrshift__ 、 __rand__ 、 __rxor__ 、 __ror__

2.8增量赋值位运算符:__ilshift__ 、 __irshift__ 、 __iand__ 、 __ixor__ 、 __ior__

四.说明魔法函数的重要性(举例len())

如果len()方法调用的对象是Python内置的类型,如list,set,dict(cpython)等,会直接获取(有一个数据表示长度),而不用去遍历。