装饰器
https://www.cnblogs.com/EVA-J/articles/7194277.html
1. 装饰器的形成过程
2.装饰器的作用
3.语法糖
原则: 开放封闭原则
----------------------------------------------------------------------------------------------------------------------------------------------------------------
固定模式:装饰器固定模式
===========================================================================================
1.
import time def func(): time.sleep(0.01) print("大家好") def timer(f): start = time.time() f() end = time.time() print(end-start) timer(func)
解读这段代码 !
首先 ,我们定义一个函数 func为例实现 leader交给我的功能! ok ,这个func函数假装已经完成我们想要的功能 。
现在 我们想要在func函数的基础上增加 计算程序运行时间的功能,引入time 模块 ,通过 time.time()获取当前时间
这样 ,我们的func函数可以这样写
def func():
start = time.time() # 程序运行前时间
print("大家好,才是真的好!") # 这里假装是我们的业务逻辑代码,想象这有很多行好吧。
end = time.time() # 程序运行结束时间
print(end - start) # 获取时间差,就可以知道程序运行时间的长短了。
这样就是我们在函数原有的基础上扩展的功能 !
但是,违背了我们开发中的 开放-封闭原则!
开放:对扩展是开放的
封闭:对修改是封闭的
不想修改函数的调用方式,但是还在原有的函数前后添加功能
----------------------------------------------------------------------------------
那我们把 要增加功能的函数当作参数
增加一个装饰器函数
def timer(f):
def inner()
start = time.time()
f()
end = time.time()
print(end-start)
return inner
func = timer() # 这里返回的是inner 相当于把inner的内存地址赋值给了func
func() 这里实际执行的是 inner() ----- 最终获取了 print(end-start)
ok, 这就是我们的装饰器函数
timer就是一个装饰器函数,只是对一个函数 有一些装饰作用
===========================
语法糖的概念
就是让代码更简洁,像吃糖一样开心 ~~哈哈
@timer #装饰器函数的函数名
def func():
pass # 要贴着被装饰的函数
这才是真正的 不改变函数调用方式
装饰带参数函数的装饰器
19.27 动态参数 !!!
*arg **kwargs 能hold整个世界
wrapper 装饰器
www.cnblogs.com/eva-j/articles/7194277.html
来源:https://www.cnblogs.com/polite/p/10122180.html