python 基础 day04—装饰器
装饰器
定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能
原则:
- 不能修改被装饰的函数的源代码
- 不能修改被装饰的函数的调用方式
示例1
import time def timmer(func): def warpper(*args,**kwargs): start_time = time.time() func() stop_time = time.time() print("the func run time is %s" %(stop_time - start_time)) return warpper @timmer def test1(): time.sleep(3) print("in the test1") test1()
从示例1中我们可以看出装饰器符合上诉定义和原则
实现装饰器的知识储备如下:
- 函数即“变量”
- 高阶函数
a.把一个函数名当做实参传给另外一个函数(在不修改被装饰函数源代码的情况下为其添加功能)
b.返回值中包含函数名(不修改函数的调用方式)
- 嵌套函数
综上
高阶函数+嵌套函数==》装饰器
接下来我们来分析一下上面例子
无参装饰器
import time def timmer(func): #装饰器 func=test1—>timmer(test1) def warpper(): start_time = time.time() func() stop_time = time.time() print("the func run time is %s" %(stop_time - start_time)) return warpper @timmer # test1=timmer(test1)=warpper def test1(): time.sleep(3) print("in the test1") test1()
执行步骤:
1.执行装饰器@timmer ,@timmer相当于test1=timmer(test1),
把test1传进timmer(),返回warpper
所以test1=timmer(test1)=warpper
2.执行test1(),test1()=warpper()
执行warpper()
同时因为func为形参,test1为传进timmer()的实参
所以func()=test1()
warpper()执行过程为:
1.获取开始时间
2.执行func()=test1()
3.获取结束时间
4.打印信息
固定参数装饰器
# cherry cui import time def timmer(func): #装饰器 func=test2—>timmer(test2) def warpper(name): start_time = time.time() func(name) stop_time = time.time() print("the func run time is %s\n" %(stop_time - start_time)) return warpper @timmer #test2=timmer(test2)=warpper 所以test2(name)=warrpper(name) def test2(name): time.sleep(2) print("name:",name) test2("cherry")
不固定参数装饰器
import time def timmer(func): #装饰器 func=test1—>timmer(test1) def warpper(args,*kwargs): start_time = time.time() func(args,*kwargs) stop_time = time.time() print("the func run time is %s\n" %(stop_time - start_time)) return warpper @timmer def test2(name,age): time.sleep(2) print("name:",name) print("age:", age) test2("cherry",17)
*args,**kwargs可接受存在或不存在的参数
因此
一个可有参和无参都适用的装饰器
import time def timmer(func): #装饰器 func=test1—>timmer(test1) def warpper(*args,**kwargs): start_time = time.time() func(*args,**kwargs) stop_time = time.time() print("the func run time is %s\n" %(stop_time - start_time)) return warpper @timmer #test1=timmer(test1) def test1(): time.sleep(3) print("in the test1") @timmer def test2(name,age): time.sleep(2) print("name:",name) print("age:", age) test1() test2("cherry",17)