python 基础---装饰器

装饰器的本质:一个闭包函数

装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展

装饰器的返回值:也是一个函数

 1 import time
 2 
 3 def func1():
 4     print('in func1')
 5 
 6 def timer(func):
 7     def inner():
 8         start = time.time()
 9         func()
10         print(time.time() - start)
11     return inner
12 
13 func1 = timer(func1)
14 func1()

语法糖

 1 import time
 2 def timer(func):
 3     def inner():
 4         start = time.time()
 5         func()
 6         print(time.time() - start)
 7     return inner
 8 
 9 @timer   #==> func1 = timer(func1)
10 def func1():
11     print('in func1')
12 
13
14 func1()

带参数的装饰器

 1 import time
 2 def timer(func):
 3     def inner(*args,**kwargs):
 4         start = time.time()
 5         re = func(*args,**kwargs)
 6         print(time.time() - start)
 7         return re
 8     return inner
 9 
10 @timer   #==> func1 = timer(func1)
11 def func1(a,b):
12     print('in func1')
13 
14 @timer   #==> func2 = timer(func2)
15 def func2(a):
16     print('in func2 and get a:%s'%(a))
17     return 'fun2 over'
18 
19 func1('aaaaaa','bbbbbb')
20 print(func2('aaaaaa'))

装饰器的固定格式

1 def timer(func):
2     def inner(*args,**kwargs):
3         '''执行函数之前要做的'''
4         re = func(*args,**kwargs)
5         '''执行函数之后要做的'''
6         return re
7     return inner
1 from functools import wraps
2 
3 def deco(func):
4     @wraps(func) #加在最内层函数正上方
5     def wrapper(*args,**kwargs):
6         return func(*args,**kwargs)
7     return wrapper

猜你喜欢

转载自www.cnblogs.com/dzc18/p/9338647.html