装饰器的基础
学习前提: 作用域 + 函数的理解 + 闭包 【学习,理解】
代码编写原则: 对修改开放对扩展开放
装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象。
装饰器的应用:经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等应用场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。
装饰器作用:装饰器感觉就像是内部函数的调用应用,为已经存在的对象添加额外的功能。
原理讲解
基础原理讲解:不更改原来函数foo()的调用的基础上添加新的功能【假设每次都调用foo】
import time # 利用内部函数 来实现装饰器 def show_time(f): def inner(): start = time.time() f() end = time.time() print("耗时", str(end - start)) return inner def foo(): print('foo') time.sleep(2) def bar(): print('bar') time.sleep(3) # 这里就是装饰器,添加了新功能的同时还不影响原来的函数应用 foo = show_time(foo) foo() bar = show_time(bar) bar()
Python的装饰器的实现:
@功能函数
import time def show_time(f): def inner(): start = time.time() f() end = time.time() print("耗时", str(end - start)) return inner @show_time # foo = show_time(foo) def foo(): print('foo') time.sleep(2) @show_time # bar = show_time(bar) def bar(): print('bar') time.sleep(3) foo() bar()
装饰器之被装饰函数的参数:
参数在功能函数上添加, 装饰器参数对应的添加即可
import time def show_time(f): def inner(*args): start = time.time() f(*args) end = time.time() print("耗时", str(end - start)) return inner @show_time # foo = show_time(foo) def foo(*args): summary = 0 for i in args: summary += i print(summary) time.sleep(2) @show_time # bar = show_time(bar) def bar(): print('bar') time.sleep(3) foo(2, 4, 4) bar()
装饰器之装饰函数的参数:
多一层嵌套实现,代码更加灵活
# foo函数添加日志的写操作, bar函数不添加 import time def logger(): logger_format = '%F %T' with open('log.txt', 'a+', encoding='utf-8') as f: f.write('当前时间是:%s\n'% time.strftime(logger_format)) def log(flag = ''): def show_time(f): def inner(*args): start = time.time() f(*args) end = time.time() print("耗时", str(end - start)) if flag == 'true': logger() return inner return show_time @log('true') # 等价于@show_time('true') / show_time = show_time('true') def foo(*args): summary = 0 for i in args: summary += i print(summary) time.sleep(2) @log('') # 等价于@show_time('') / show_time = show_time('') def bar(): print('bar') time.sleep(3) foo(2, 4, 4) bar()
复杂装饰器
def makebold(fn): def wrapper(): return "<b>" + fn() + "</b>" return wrapper def makeitalic(fn): def wrapper(): return "<i>" + fn() + "</i>" return wrapper @makebold @makeitalic def hello(): return "hello world" print(hello()) # <b><i>hello world</i></b>
来源:https://www.cnblogs.com/ftl1012/p/9382699.html