python中的装饰器

什么是装饰器:可以理解为添加新的功能。
定义:在不改变原被装饰的函数的源代码以及调用方式下,为其添加额外的功能。
装饰器形成的过程 *args 接收:聚合 调用:打散
import time
print(time.time())
time.sleep(3)#让程序执行到此位置的时候停留
print('vhdihfiufhui')
def timer(f):#计算函数的执行时间
start = time.time()
f()
end=time.time()
print(end-start)
def func():
time.sleep(1)
print('hahahhah')

timer(func)


装饰器的作用:
在不改变原函数的调用方式的情况下,在函数的前后添加功能
装饰器的本质是:闭包
原则:开放封闭原则

1.对扩展是开放的

2.对修改是封闭的

   

装饰器的固定模式

def func():
time.sleep(2)
print('哈哈哈哈哈')

def timmer(func): #闭包 ----》指向func的内存地址 timmer就是一个装饰器函数
def inner():
start=time.time()
func() #被装饰的函数
end=time.time()
print(end-start)
return inner

func=timmer(func) #先执行后面的function就是第一个函数
func() #实际执行innner
timmer就是一个装饰器函数,只是对一个函数,有一些装饰作用

不想修改函数的调用方式,但是还想在原来的函数前后添加功能,so 使用装饰器

语法糖:使代码更便捷
@timmer(装饰器函数的名字) 写在被装饰的函数的上面 这个就相当于:func=timmer(func)

练习:
def wrapper(func):# 传入func:被装饰的函数 *****
def inner(*args,**kwargs):
print('在被装饰的函数之前做的事')
ret=func(args,**kwargs) #func被装饰的函数 参数是inner传给他的
print('在被装饰的函数执行之后做的事')
return ret
return inner
@wrapper #holiday=wrapper(holiday)
def holiday(day):
print('放假%s'%day)
return '哈哈哈哈哈'

ret=holiday(3) #调用holiday
print(ret)

#装饰器的固定格式一:
def timmer(func):
def inner(*args,**kwargs):
'''执行函数之前要做的'''
re=func(*args,**kwargs)
'''执行函数之后要做的'''
return re
return inner
装饰器的固定格式二---wrappet版
from functools import wraps
def deco(func):
@wraps(func)#加在最内侧函数最上方
def wrapper(*args,**kwargs):
return func(*args,**kwargs)
return wrapper



装饰器的进阶
functools.wraps
带参数的装饰器
多个装饰器装饰同一个函数
def haha():
print('hahah')
'''
一个打印哈哈的函数
'''
print(haha.__name__)#查看函数(字符串)名
print(haha.__doc__)#查看文本的函数


加入:
from functools import wraps
@wraps(func)
能查看函数的名字和文本 而不是装饰器的信息

原文地址:https://www.cnblogs.com/lxx99/p/11694174.html