装饰器
1.装饰器函数的本质:一个闭包函数
2.装饰器函数的作用:在不修改原函数及其调用方式的情况下对原函功能进行扩展
3.语法格式: @装饰器名称
def foo(): print('foo') foo()
# 公司有N个部门,每个部门负责相应的业务 def f1(): print("身份验证") print("f1") def f2(): print("身份验证") print("f2") def f3(): print("身份验证") print("f3") def f4(): print("身份验证") print("f4") f4() # 身份验证 # f4
#更改 # def check(): print('身份验证') def f1(): check() print("f1") def f2(): check() print("f2") def f3(): check() print("f3") def f4(): check() print("f4") f3() # 身份验证 # f3
# 开放封闭原则 # 封闭:对已经实现的功能代码块,不能轻易修改 # 开发:可以对外扩展功能 def check(f): def inner(): print("身份验证") f() return inner @check def f1(): print("f1") @check def f2(): print("f2") # f1() f2()
def outter(f): def inner(): print("---这是内嵌函数---") f() print('---在这里执行完了--') print("---外层函数---") return inner @outter def func(): print("----就看看你想干哈----") func() print(func.__name__) # ---外层函数--- # ---这是内嵌函数--- # ----就看看你想干哈---- # ---在这里执行完了-- # inner
import time def outter(f): def inner(): x1 = time.time() f() x2 =time.time() x = x2-x1 print("程序运行了{}秒".format(x2-x1)) return inner @outter def func(): time.sleep(2) print('我就想它执行一秒怎么滴') func() # 我就想它执行一秒怎么滴 # 程序运行了2.0008254051208496秒
import time def outter(f): def inner(): x1 = time.strftime("%Y-%m-%D %X",time.localtime()) print(x1) f() x2 = time.strftime("%Y-%m-%D %X", time.localtime()) print(x2) return inner @outter def func(): time.sleep(2) print('我就想它执行一秒怎么滴') func() # #2020-04-04/16/20 00:19:08 # 我就想它执行一秒怎么滴 # 2020-04-04/16/20 00:19:10
# 多个装饰器原理 #执行原理:先执行距离函数近的装饰器 def outter1(f): def inner1(): print('-----before inner1-----') f() print('--------After inner1----------') return inner1 def outter2(f): def inner2(): print('-----before inner2-----') f() print('--------After inner2----------') return inner2 @outter1 @outter2 def func(): print("看看什么是多个装饰器,学习学习") func() # # -----before inner1----- # -----before inner2----- # 看看什么是多个装饰器,学习学习 # --------After inner2---------- # --------After inner1----------
# 带参数的装饰器 def outter(f): def inner(*args,**kwargs): print(args) print(kwargs) f() return inner @outter def func(): print("什么鬼,还有参数") func(10,20,name ='johnson') # (10, 20) # {'name': 'johnson'} # 什么鬼,还有参数
def outter(f): def inner(a,b): f(a,b) return inner @outter #func = outter(func) def func(a,b): print(a+b) print("什么鬼,还有参数") func(10,20) print(func.__name__) # 30 # 什么鬼,还有参数 # inner
def outter(f): def inner(): ret = f() return ret return inner @outter def func(): print("卧槽,还有返回值") return "卧槽,无情" func() print(func()) #执行inner,inner需要有返回值才能打印,否则就是None # 卧槽,还有返回值 # 卧槽,还有返回值 # 卧槽,无情
# 使用@wraps(func)解决被装饰函数的信息不能查看问题 from functools import wraps def outter(f): @wraps(f) def inner(*args,**kwargs): f() return inner @outter def func(): print("卧槽,还能用wraps") func(10,20,name='johnson') print(func.__name__) # 卧槽,还能用wraps # func