本小节主要讲python中魔法函数,并用表格的方式列举出python中的魔法函数,供大家查找学习。最后还讲了len函数在python中是如何工作的。

1.魔法函数定义

魔法函数是python中的一种高级语法,允许你在类中自定义函数,自定义的函数格式为(xxx),并绑定到类的特殊方法中。

注意:魔法函数必须是python中提供的函数,自己定义的函数是没有用的。

class Company:
    def __init__(self,employee_list):
        self.employee = empoloyee_list

    def __getitem__(self, item):
        return self.employee[item]

company = Company(['wali','eve'])
for em in company:
    print(em)

#输出
wali
eve

定义Company类,类是不能够迭代的,就是不能用for语句来进行遍历,当我们在company类中定义了__getitem__方法后,company类就可以迭代了,python解释器在内部帮我们完成了功能。

2.魔法函数一览

非数学运算

作用函数名称
字符串相关__repr__、__str__
集合、序列相关__len__、__getitem__、__setitem__、__delitem__、__contains__
迭代相关__iter__、__next__
可调用__call__
上下文管理__enter__、__exit__
数值转换__abs__、__bool__、__int__、__float__、__hash__、__index__
元类相关__new__、__init__
属性相关__getattr__、__setattr__、__getattribute__、__setattribute__、__dir__
属性描述符__get__、__set__
协程__await__、__aiter__、__anext__、__aenter__、__aexit__

数学运算

作用函数名称
一元运算符__neg__(-)、__pos__(+)、__abs__
二元运算符__lt__(<)、__le__(<=)、__eq__(==)、__ne__(!=)、__gt__(>)、__ge__(>=)
算术运算符__add__(+)、__sub__(-)、__mul__(*)、__truediv__(/)、__floordiv__(//)、__mod__(%)、__divmod__、__pow__(**)、__round__
反向算术运算符__radd__、__rsub__、__rmul__、__rtruediv__、__rfloordiv__、__rmod__、__rdivmod__、__rpow__
增量赋值算术运算符__iadd__、__isub__、__imul__、__itruediv__、__ifloordiv__、__ipow__
位运算符__invert__(~)、__lshift__(«)、__rshift__(»)、__and__(&)、__or__(|)、__xor__(^)
反向位运算符__rishift__、__rrshift__、__rand__、__rxor__、__ror__
增量赋值位运算符__ilshift__、__irshift__、__iand__、__ixor__、__ior__

3.len函数

class Person:
    def __init__(self,name):
        self.name = name

    def __len__(self):
        return len(self.name)

p = Person(['aaa','bbb'])

print(len(p))

>>> 2

当我们使用len方法时,python会隐含调用对象__len__方法,使用len获取listsetdicttuple等等Python内置类型的数据长度时,其实没有调用对象__len__方法,python的解释器是C语言来编写的,在内部维护一个数据长度的变量,为提升执行效率,直接获取内部数据的长度。

python3.7 进阶

python 一切皆对象 python 魔法函数 python 类和对象 python Mixin python 自定义序列类 python dict python 对象引用、可变性和垃圾回收 python 元类编程