装饰器
装饰器 = 高阶函数 + 函数嵌套 + 闭包
本质就是函数,功能是为其他函数添加新功能
1.不修改被装饰函数的源代码(开放封闭原则)
2.为被装饰函数添加新功能后,不修改被修饰函数的调用方式
在需要使用装饰器的函数前面使用语法糖@装饰器
高阶函数定义:
1.函数接收的参数是一个函数名
2.函数的返回值是一个函数名
3.满足上述条件任意一个,都可称之为高阶函数
函数嵌套
函数内又定义有函数(和调用其它函数不是同一个概念)
闭包
在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包。闭包可以用来在一个函数与一组“私有”变量之间创建关联关系。在给定函数被多次调用的过程中,这些私有变量能够保持其持久性。
根据这句话,其实我们自己就可以总结出在python语言中形成闭包的三个条件,缺一不可:
1)必须有一个内嵌函数(函数里定义的函数)——这对应函数之间的嵌套
2)内嵌函数必须引用一个定义在闭合范围内(外部函数里)的变量——内部函数引用外部变量
3)外部函数必须返回内嵌函数——必须返回那个内部函数
# # 高阶函数 # def foo(): # print('我的函数名作为参数传给高阶函数') # # # def gao_jie1(func): # print('我就是高阶函数1,我接收的参数名是%s' % func) # func() # # # def gao_jie2(func): # print('我就是高阶函数2,我的返回值是%s' % func) # return func # # # gao_jie1(foo) # gao_jie2(foo) # # 嵌套函数 # def father(name): # print('from father %s' %name) # def son(): # print('from son') # def grandson(): # print('from grandson') # grandson() # son() # # father('a') # # ''' # # 闭包:在一个作用域里放入定义变量,相当于打了一个包 # # ''' # def father(name): # def son(): # # name='alex' # print('我爸爸是 [%s]' %name) # def grandson(): # # name='wupeiqi' # print('我爷爷是 [%s]' %name) # grandson() # son() # # print(locals()) # # father('a') # #装饰器架子 # def decorator(func): # def wrapper(*args, **kwargs): # print(func) # res = func(*args, **kwargs) # return res # return wrapper # # example # def decorator(func): # def wrapper(*args, **kwargs): # print("主持人说:", end='') # func(*args, **kwargs) # return wrapper # # # 在需要使用装饰器的函数前面使用 @ 装饰器 # # @decorator # @decorator #say = decorator(say) # def say(): # print("大家好") # # # say = decorator(say) # say()
装饰器模板
from functools import wraps # 无参装饰器 def wrapper(func): #func 被装饰的函数 @wraps(func) # 保留func的所有属性 def inner(*args, **kwargs): # do someting.... ret = func(*args, **kwargs) # do someting.... return ret return inner # 带参装饰器 def param(*param): def wrapper(func): #func 被装饰的函数 @wraps(func) # 保留func的所有属性 def inner(*args, **kwargs): # do someting.... ret = func(*args, **kwargs) # do someting.... return ret return inner return wrapper