魔法函数
一,什么是魔法函数
在触发某些条件的情况下回自动调用的函数,以双下划线开头和结尾,例如
__iter__
,__getitem__
class Company(object):
def __init__(self, employee_list):
self.employee_list = employee_list ①
def __getitem__(self, item): ②
return self.employee_list[item]
company = Company(['Tom', 'Ary', 'Jack'])
for em in company: ③
print(em)
① 实例的时候接受参数
② 实现 __getiter__
魔法方法,实现此方法的对象是一个序列,每次被迭代item就会以 0, 1, 2等去取属性里面 的值,直到抛出异常位置
③ for 循环背后实际上是首先做的事情是对in 后面的对象进行iter,若有迭代器,对迭代器进行迭代,否则调用 __getitem__
方法
二,python数据模型对python的影响
魔法函数实际上就是叫做数据模型,因为网上都叫魔法函数,叫多就成自然了
class Company(object):
def __init__(self, employee_list):
self.employee_list = employee_list
def __getitem__(self, item):
return self.employee_list[item]
def __len__(self):
return len(self.employee_list)
company = Company(['Tom', 'Ary', 'Jack'])
for em in company: # 实现了迭代的方法
print(em)
print(company[:2]) # 实现了序列的方法
print(len(company)) # 实现了 len 的方法
----------------------------------------
Tom
Ary
Jack
['Tom', 'Ary']
3
python 的魔法函数会对代码的运行产生影响,在某些触发的情况下能自动在背后隐式调用,实现一个 __len__
就能够对实例实现 len() 的方法,实现 __getitem__
方法就能被 for 循环和 切片 引用
三,python魔法函数一览
class Company(object):
def __init__(self, employee_list):
self.employee = employee_list
def __repr__(self):
"""
调试专用的方法,在解释器里面生效
"""
return 'employee : {}'.format(self.employee)
def __str__(self):
"""
使用print会自动调用这个方法
:return:
"""
return '我是print打印出来的'
c = Company(['Jack', 'Jan', 'Meric'])
print(c)
c
...
我是print打印出来的
employee : ['Jack', 'Jan', 'Meric']
__repr__
对开发者友好,能够在交互式模式下输出信息
__str__
对使用者友好,在实例被打印时被调用
四,len函数的特殊性
len()
函数内部有优化,性能非常高,len(一个内置类型),一下子就能获取长度,因为内部c语言在创建数据类型的时候默认维护数据类型的长度,调用的时候直接是取值的,效率高
五,本章小结
实现对应数据类型的魔法函数就能够变成对饮的数据类型,例如一个类实现 __getitem__
魔法函数,那个他就是一个序列类型