开始接触装饰器:
import time #导入时间模块 def func(): #被装饰的函数 time.sleep(0.01) #让程序执行到这里时暂停0.01秒 print("测试一下") def time_counter(f): #装饰器函数 如果想不到定义名字,一般用wrapper,意思就是装饰器 def inner(): start = time.time() f() #被装饰的函数 --> 执行def func()函数 end = time.time() print(end - start) return inner #返回inner的内存地址 func = time_counter(func) #inner的内存地址赋给 func func() #实际调用 inner() 函数,告诉 def inner() 函数开始执行
装饰器的作用:在不修改函数调用方式的情况下,还想在原来的函数前后添加功能
开放封闭原则
开放:对扩展是开放的
封闭:对修改是封闭的
进一步了解装饰器:引入"语法糖"概念,表示形式为 @装饰器函数名
@装饰器函数名,要紧紧贴在被装饰函数的上面,用来修饰被装饰函数
import time def time_counter(f): def inner(): start = time.time() ret = f() #接收被装饰函数的返回值 end = time.time() print(end - start) return ret #返回被装饰函数的返回值 return inner @time_counter #相当于执行func = time_counter(func) def func(): time.sleep(0.01) print("测试一下") return "两只老虎" #返回值,通过inner()函数返回自己的返回值 ret = func() #func为inner的内存地址 print(ret)
装饰"带参数函数"的装饰器(最终版):
import time def time_counter(f): def inner(*args, **kwargs): start = time.time() ret = f(*args, **kwargs) end = time.time() print(end - start) return ret return inner @time_counter def func(): time.sleep(0.01) print("once test") return "second test" ret = func() print(ret)
装饰器的固定模式:
def wrapper(f): #装饰器函数,f是被装饰的函数 def inner(*args, **kwargs): """在被装饰函数之前要做的事""" ret = f(*args, **kwargs) #被装饰的函数,及其返回值赋给ret """在被装饰函数之后要做的事""" return ret return inner