装饰器:在不改变原函数和原函数执行状态下,为函数增加功能
万能装饰器:
def wrapper(func): def inner(): """执行函数之前的功能""" ret = func() """执行函数之后的功能""" return ret return inner @wrapper #func = wrapper(func) def func(): pass func()
eval: 读取文本内容的时候,都是字符串,可以用eval转换一下,本身什么类型,就读出什么类型
开放封闭原则:
1、 对扩展是开放的
2、 对修改是封闭的
函数的有用信息:
def f1(): ''' 本函数的功能:绘图功能,实时接收数据并绘图. :return: 绘图需要的数据,返回给前端某标签 ''' print(f1.__doc__) #打印注释 print(f1.__name__) #打印函数名字 f1()
#输出:
本函数的功能:绘图功能,实时接收数据并绘图.
:return: 绘图需要的数据,返回给前端某标签
f1
有装饰器的情况下打印有用信息:
rom functools import wraps def wrapper(func): @wraps(func) def inner(*args,**kwargs): '''执行函数前进行的操作''' ret = func(*args,**kwargs) '''执行函数后进行的操作''' return ret return inner @wrapper def f1(): ''' 本函数的功能:绘图功能,实时接收数据并绘图. :return: 绘图需要的数据,返回给前端某标签 ''' print(f1.__doc__) print(f1.__name__) f1()
*args 和**kwargs:
def wrapper(func): def inner(*args,**kwargs): '''执行函数前''' ret = func(*args,**kwargs) '''执行函数后''' return ret return inner @wrapper def func(a,b,c,d): #接收函数时,加个*聚合 print(111) func(1,2,3,4) # f1(*[1,2,3,4]) #执行函数时,加个*打散
带参数的装饰器:
可以当作装饰器的开关
import time flag = True #flag = True 则装饰,flag = Flag 则不装饰,只执行原函数 def timmer(f): def wrapper(func): def inner(*args,**kwargs): if f: start_time = time.time() ret = func(*args,**kwargs) end_time = time.time() print(end_time - start_time) return ret else: ret = func(*args, **kwargs) return ret return inner return wrapper @timmer(flag) def func(): print(123) func()
一个装饰器装饰多个函数:
def wrapper1(func): def inner1(*args,**kwargs): print(1) ret=func(*args,**kwargs) print(2) return ret return inner1 def wrapper2(func): def inner2(*args,**kwargs): print(3) ret=func(*args,**kwargs) print(4) return ret return inner2 @wrapper1 @wrapper2 def func(): print(5) func() #输出:1 3 5 4 2