您好!此笔记的文本和代码以网盘形式分享于文末!
因个人能力有限,错误处欢迎大家交流和指正!基础部分内容简单,但多且零散!
python的装饰器 | ||
定义:在不修改原函数及其调用方式的情况下对原函数功能进行扩展, 它的返回值也是一个函数,这个函数是内嵌“原“”函数的函数。 | ||
装饰器的本质:一个闭包函数的自我进化 | ||
用法 | 栗子 | 结果 |
问题 计算函数运行时间 | import time def deco(func): start_time = time.time() func() end_time = time.time() execution_time = (end_time - start_time)*1000 print('time is %d ms' % execution_time) def f1(): print('Hello') time.sleep(0.2) print("world") deco(f1) | Hello world time is 203 ms |
装饰器实现 计算函数运行时间 | import time def deco(func): def wrapper(): start_time = time.time() func() end_time = time.time() execution_time = (end_time - start_time)*1000 print('time is %d ms' % execution_time) return wrapper @deco def f1(): print('Hello') time.sleep(0.2) print("world") f1() | Hello world time is 203 ms |
带固定参数函数的装饰器 | import time def deco(func): def wrapper(a, b): start_time = time.time() func(a, b) end_time = time.time() execution_time = (end_time - start_time)*1000 print('time is %d ms' % execution_time) return wrapper @deco # ==> f1 = deco(f1) def f1(a, b): print('Hello') time.sleep(0.2) print("result is %d" % (a+b)) f1(3, 5) | Hello result is 8 time is 203 ms |
无固定参数函数的装饰器 | import time def deco(func): def wrapper(*args, **kwargs): start_time = time.time() func(*args, **kwargs) end_time = time.time() execution_time = (end_time - start_time)*1000 print('time is %d ms' % execution_time) return wrapper @deco def f1(a, b): print('Hello') time.sleep(0.2) print("result is %d" % (a+b)) @deco def f2(a, b, c): print('Hello') time.sleep(0.2) print("result is %d" % (a+b+c)) f1(3, 5) f2(3, 6, 9) | Hello result is 8 time is 203 ms Hello result is 18 time is 203 ms |
查看函数信息的方法 | import time def deco(func): def wrapper(*args, **kwargs): start_time = time.time() func(*args, **kwargs) end_time = time.time() execution_time = (end_time - start_time)*1000 print('time is %d ms' % execution_time) return wrapper @deco def f1(a, b): """ 没有感情的注释 """ print('Hello') time.sleep(0.2) print("result is %d" % (a+b)) f1(3, 5) print(f1.__doc__) print(f1.__name__) | Hello result is 8 time is 207 ms None wrapper |
避免 查看函数信息的方法失效 | import time from functools import wraps def deco(func): @wraps(func) def wrapper(*args, **kwargs): start_time = time.time() func(*args, **kwargs) end_time = time.time() execution_time = (end_time - start_time)*1000 print('time is %d ms' % execution_time) return wrapper @deco def f1(a, b): """ 没有感情的注释 """ print('Hello') time.sleep(0.2) print("result is %d" % (a+b)) f1(3, 5) print(f1.__doc__) print(f1.__name__) | Hello result is 8 time is 203 ms 没有感情的注释 f1 |
带返回值的装饰器 | import time from functools import wraps def deco(func): @wraps(func) def wrapper(*args, **kwargs): start_time = time.time() re = func(*args, **kwargs) end_time = time.time() execution_time = (end_time - start_time)*1000 print('time is %d ms' % execution_time) return re return wrapper @deco def f1(a, b): """ 没有感情的注释 """ print('Hello') time.sleep(0.2) print("result is %d" % (a+b)) return 'world' print(f1(6, 12)) print(f1.__doc__) print(f1.__name__) | Hello result is 18 time is 203 ms world 没有感情的注释 f1 |
多个装饰器装饰1个函数 | import time from functools import wraps def deco1(func): @wraps(func) def wrapper(*args, **kwargs): print('This is deco1') start_time = time.time() re = func(*args, **kwargs) end_time = time.time() execution_time = (end_time - start_time)*1000 print('time is %d ms' % execution_time) print('deco1 end') return re return wrapper def deco2(func): @wraps(func) def wrapper(*args, **kwargs): print('This is deco2') re = func(*args, **kwargs) print("deco2 end") return re return wrapper @deco1 @deco2 def f1(a, b): """ 没有感情的注释 """ print('Hello') time.sleep(0.2) print("result is %d" % (a+b)) return 'world' print(f1(6, 12)) print(f1.__doc__) print(f1.__name__) | 多个装饰器的情况下 f(6, 12) = deco1(deco2(f(6, 12))) This is deco1 This is deco2 Hello result is 18 deco2 end time is 203 ms deco1 end world 没有感情的注释 f1 |
带参数的装饰器 方便的控制装饰器的开或闭 | a = True def outer(flag): def timer(func): def inner(*args, **kwargs): if flag: print('执行函数前添加的功能代码') re = func(*args, **kwargs) if flag: print('执行函数后添加的功能代码') return re return inner return timer @outer(a) def func(x, y): b = x + y print('x+y的值是:%d' % b) return 8 print(func(3, 4)) | 执行函数前添加的功能代码 x+y的值是:7 执行函数后添加的功能代码 8 |
愿有更多的朋友,在网页笔记结构上分享更逻辑和易读的形式:
链接:暂无
提取码:暂无