标签:基本 情况下 war res color 工作流 nbsp 原函数 **kwargs
一、我们先看看装饰器的应用基本格式:
def decorator(func): def inner(*args,**kwargs): data = func(*args,**kwargs) return data return inner
外层函数中嵌套了一个内部函数,并把我们需要执行的函数地址,传入到外层函数里,最终返回一个内部函数内存地址(inner)。
应用:
def decorator(func): def inner(*args,**kwargs): print(‘在函数执行前‘) data = func(*args,**kwargs) return data return inner @decorator def fu(): return ‘hello world‘ data = fu() print(data)
@decorator 这个的作用:等价于fu =decorator(fu) #我们把fu重新赋值,返回inner地址给到fu.这时候inner没有被执行,fu的地址等于inner地址,并报原来fu的地址赋值给了func。
当我们执行调用fu()函数的时候,等于是执行了 inner函数,inner函数中执行了fu的函数,在外层函数中,我们已把fu函数地址赋值给了func.在执行fu()函数前,并可以做一些其他的操作,比如打印。
从上面的结果来说,装饰器可以在我们不修改原函数的基础上,做一些二次修改的功能。把原有函数封装在一另一个函数中(类似闭包)。
二.带参数的装饰器
基本格式:
def decorator(n): def x(func): def inner(*args,**kwagrs): val = [] for i in range(n): data = func() val.append(data) return val return inner return x @decorator(9) def fu(): return 666 data = fu() print(data)
多参数的装饰是在基本装饰器的基础上又加了一层嵌套,它的工作流程:
1.先执行最外层的函数,decorator(n),在内存中建立x函数,并返回了x内存函数的地址,n=作为参数,接受值
2.再执行x函数,在内存中建立了inner函数,并把被封装的函数作为参数,穿进inner只能中,等价于fu =x(fu),并返回inner内存地址,如此在装饰器当中就有2个值 n=9 func=fu
3.接下来执行fu(),相当于执行了inner函数中的代码,我们就可以使用保存下来的2个值进行下面的操作。
最终结果为:[666, 666, 666, 666, 666, 666, 666, 666, 666]
注:如果不使用@的情况下我们的装饰器赋值过程大致如下:
def decorator(n): def x(func): def inner(*args,**kwagrs): val = [] for i in range(n): data = func() val.append(data) return val return inner return x def fu(): return 666
res = decorator(9) res1 = res(fu) fu = res1 data = fu() print(data)
结果跟上一个结果是一样,如果不用 @,我们使用如下方式也能达到效果。
标签:基本 情况下 war res color 工作流 nbsp 原函数 **kwargs
原文地址:https://www.cnblogs.com/jinyan-huang/p/11416522.html