装饰器

 

装饰器:

1,什么是装饰器

装饰器是一个用来被装饰者添加功能的工具

被装饰者:函数

装饰器:可以用函数实现装饰器这种工具

2,为什么要用装饰器

为了在不修改被装饰器对象源代码以及调用方式的前提下为被装饰对象添加上新功能

 

无参装饰器:

相当于叠加两层的闭包函数

 

import time

def index(x):
print('welcome to index page %s ' % x )
time.sleep(3)

 


#方案一:修改了源代码
import time

def index(x):
start = time.time()
print('welcome to index page %s ' % x )
time.sleep(3)
stop = time.time()
print(stop-start)
index(111)

#方案二:没有修改被装饰对象的源代码以及调用方式,但有代码冗余

import time

def index(x):
print('welcome to index page %s ' % x )
time.sleep(3)

start = time.time()
index(111)
stop = time.time()
print(stop-start)

# 方案三:wrapper函数需要外部传入参数

import time


def index(x):
print('welcome to index page %s ' % x)
time.sleep(3)

 

def wrapper(func):
start = time.time()
func(111)
stop = time.time()
print(stop - start)
wrapper(index)

 

 


# 方案五:

import time

def index(x):
print('welcome to index page %s ' % x )
time.sleep(3)
return 666
def otuuer(func):
def wrapper(*args,**kwargs):
start = time.time()
res = func(*args,**kwargs)
stop = time.time()
print(stop-start)
return res
return wrapper

index = outter(index)
res = index(111)
print(res)


# 方案六:把wrapper伪装的跟被装饰对象一样,更进一步

import time

def index(x):
print('welcome to index page %s ' % x )
time.sleep(3)
return 666
def otuuer(func):
def wrapper(*args,**kwargs):
start = time.time()
res = func(*args,**kwargs)
stop = time.time()
print(stop-start)
return res
wrapper.__doc__ = index.__doc__
wrapper.__name__ = index.__name__
return wrapper

index = outter(index)
res = index(111)
print(res)

无参装饰器模板:
def outter(func):
def wrapper(*args,**kwargs):
res = func(*args,**kwargs)
return res
return wparrer

 

有参装饰器:

相当于叠加三层的闭包函数

 

结论:最多三层

def outter(x):#这里还可以加参数
def deco(func):
def wrapper(*args,**kwargs):
print(x)
res = func(*args,**kwargs)
return res
return wrapper
return deco

@outter(111)
def index():
pass

 

 

装饰器语法糖

import time
from functools import wraps

def outter(func):
@wraps(func)
def wrapper(*args,**kwargs):
start = time.time()
res = func(*args,**kwargs)
stop = time.time()
print(stop-start)
return res
wrapper.__doc__ = index.__doc__
wrapper.__name__ = index.__name__
return wrapper


@outter
def index(x):
print('welcome to index page %s ' % x )
time.sleep(3)
return 666

 

叠加多个装饰器

加载顺序于执行顺序

def index():
print('from index')


def deco1(func1):
def wrapper1(*args,**kwargs):
print('运行wrapper1')
res1 = func1(*args.**kwargs)
return res1
return wrapper1

def deco1(func2):
def wrapper2(*args,**kwargs):
print('运行wrapper1')
res2 = func2(*args.**kwargs)
return res2
return wrapper2

 

def deco3(func1):
def wrapper3(*args,**kwargs):
print('运行wrapper1')
res3 = func3(*args.**kwargs)
return res3
return wrapper3


@deco1
@deco2
@deco3
def index():
print('from index')




从上往下运行,结束是从下往上

 

 

posted @ 2021-07-01 21:42  旧梦难圆  阅读(57)  评论(0)    收藏  举报