一.什么是魔法函數
Python內置的以雙下划線開頭並以雙下划線結尾的函數(不能自己定義,沒有用),如__init__(),__str__(),__getitem()__等很多,用於實現並定制很多特性,非常靈活,且是隱式調用的。
如__getitem__()可以把類變成一個可迭代的對象(一次一次取數據,直到拋異常):
二.Python的數據模型以及數據模型對Python的影響
魔法函數會直接影響到Python語法本身,如讓類變成可迭代的對象,也會影響Python的一些內置函數的調用,如實現__len__()能對對象調用len()方法。
三.魔法函數一覽
1.非數學運算:
1.1字符串表示:__repr__,__str__
__str__:定制字符串格式化(類到字符串),__repr__類似,但是是開發模式下
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()內置方法
2.2二元運算符:__lt__(<)、 __le__ <= 、 __eq__ == 、 __ne__ != 、 __gt__ > 、 __ge__ >=
2.3算術運算符:__add__ + 、 __sub__ - 、 __mul__ * 、 __truediv__ / 、 __floordiv__ // 、 __mod__ % 、 __divmod__ divmod() 、 __pow__ ** 或 pow() 、 __round__ round()
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)等,會直接獲取(有一個數據表示長度),而不用去遍歷。