Python装饰器
装饰器
- 本质是函数
- 功能: 装饰其他函数,即为其他函数添加附加功能
- 装饰器需要遵循的原则:
- 不能修改被装饰的函数
- 例: 现在有三个函数 , 各自有其功能. 如果需要给这三个函数都添加一个日志功能. 或这三个函数都已经在线上运行了, 现在需要再新增一些功能. 可以采取的方法:
- 修改源代码, 每个函数都添加这些功能 (风险非常大)
- 例: 现在有三个函数 , 各自有其功能. 如果需要给这三个函数都添加一个日志功能. 或这三个函数都已经在线上运行了, 现在需要再新增一些功能. 可以采取的方法:
- 不能修改被装饰的函数的调用方式
- 装饰器对被装饰的函数是完全透明的. 即装饰器完全不影响原函数.
- 不能修改被装饰的函数
1 import time 2 def timmer(func): # 装饰器 3 def warpper(*args, **kwargs): 4 start_time = time.time() 5 func() 6 stop_time = time.time() 7 print('the func run time is %s' %(stop_time-start_time)) 8 return warpper 9 10 @timmer 11 def test1(): 12 time.sleep(3) 13 print('test1') 14 15 16 test1()
实现装饰器知识储备:
- 函数即"变量"
-
1 def bar(): 2 print('bar') 3 4 5 def foo(): 6 print('foo') 7 bar() 8 9 10 foo() 11 12 13 print("=========================") 14 15 # 测试函数中引用的函数可以是定义在测试函数前面, 也可以是定义在测试函数后面的. 但一定是在调用函数语句的前面. 16 17 18 def foo1(): 19 print('foo1') 20 bar1() 21 22 23 def bar1(): 24 print('bar1') 25 26 27 foo1()
- a: 把一个函数名当做实参传给另外一个函数 (在不修改被装饰函数情况下为其添加功能)
-
1 print("=========== 返回函数内存地址 ===========") 2 3 4 def bar(): 5 print('bar') 6 7 8 def test1(func): 9 print(func) 10 11 12 test1(bar) # 返回一段内存地址 13 14 15 print("=========== 返回函数执行结果 ===========") 16 17 18 # 若想返回函数的执行结果而不是函数的内存地址, 需要这样更改 19 def bar(): 20 print('bar') 21 22 23 def test1(func): 24 print(func) 25 func() 26 27 28 test1(bar) # 返回bar 29 30 31 print("=========== 高阶函数进阶版 ===========") 32 33 34 import time 35 36 37 def bar(): 38 print('bar') 39 40 41 def test1(func): # 实现了装饰器的功能. 运行bar()函数的同时附加了计时功能. 但是改变了函数调用方式,所以这种方法不能称为装饰器. 42 start_time = time.time() 43 func() # run bar 44 stop_time = time.time() 45 print('the func run time is %s' % (stop_time-start_time)) 46 47 48 test1(bar)
-