什么是装饰器
先介绍三个相关概念
1.什么是一等对象
1).对象在函数运行时创建。
2).能赋值给变量或者作为数据结构中的元素。
3).能作为参数传递
4).能作为返回值返回
python 中所有的对象【字符串、列表、元组、字典、集合等等】 都是一等对象
2.高阶函数
1)将函数作为参数传递
2)将函数作为返回值返回
满足其一就是高阶函数。
3.闭包
闭包必须满足以下三个条件:
1).必须使用嵌套函数
2).外层函数必须将内层函数作为返回值返回
3).内层函数必须使用外层函数的变量
4.装饰器
我理解的装饰器就时一个闭包。只是这个闭包有点特殊。
1).外层函数的必须将一个函数作为参数
2).内层函数应该使用不定长参数,与不定长关键字参数【*args,**kwargs】作为参数
装饰器的两种用法
假设我们有两个函数,求任意个数字的和及任意两个数字的乘积
要求:让我们在函数前面及后面打印当前系统时间
deffunction(*a):# 求任意个数的和returnsum(a) defmultiple(a,b):# 求任意两个数字的乘积returna*b# 创建装饰器defdecorator(old): definner(*args,**kwargs): print("开始执行时间:",time.strftime("%H:%M:%S",time.localtime(time.time()))) g=old(*args,**kwargs) print("结束执行时间:",time.strftime("%H:%M:%S",time.localtime(time.time()))) returngreturninner
第一种,直接调用
add=decorator(function) # 求任意数字的和result_1=add(1,23,4,5,6,67,8) print(result_1) result_2=add(2,3) print(result_2) mul=decorator(multiple) # 求任意两个数字的积result_1=mul(2,4) print(result_1) result_2=mul(2,4) print(result_2)
第二种,使用@
在任何想要使用装饰器的函数的上面使用 【@ + 装饰器名字】
# 修改# 创建装饰器defdecorator(old): definner(*args,**kwargs): print("开始执行时间:",time.strftime("%H:%M:%S",time.localtime(time.time()))) g=old(*args,**kwargs) print("结束执行时间:",time.strftime("%H:%M:%S",time.localtime(time.time()))) returngreturninnerdeffunction(*a):# 求任意个数的和returnsum(a) defmultiple(a,b):# 求任意两个数字的乘积returna*b# 调用result=function(1,35,576,8) print(result) result=multiple(2,99) print(result)