装饰器

Posted passengerlee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器相关的知识,希望对你有一定的参考价值。

? 装饰器的作用 —— 不修改函数的调用方式 但想在原来的函数前后添加功能,可以有多个装饰器,但只对一个函数,有一些装饰作用

? 原则: 开放封闭原则     开放 :扩展是开放的      封闭 :对修改是封闭的

? 图解

技术图片

? 装饰器例子

def wrapper(f):    # 这是装饰器函数  f是被装饰的函数名
    def inner(*args,**kwargs):
        ‘‘‘在被装饰函数之前要做地事‘‘‘
        res = f(*args,**kwargs)      # 动态参数*args,**kwargs要原封不动地传给被装饰的函数f,且被装饰函数执行完的返回值要返回给res接收
        ‘‘‘在被装饰函数之后要做地事‘‘‘
        return res
    return inner

 ? 

技术图片

 

# 装饰器的固定模式
def wrapper(func):     # 5 而func就是qqxing
    def inner(*args,**kwargs):
        res = func(*args,**kwargs)     # 1 被装饰函数需要参数和返回值是res(以res接收它的返回值)  #被装饰的函数func(*args,**kwargs)
        return res                     # 2 再把res返回给“我”
    return inner

@wrapper         # 3 等同于 qqxing = wrapper(qqxing),把下面函数的名字作为参数且执行完装饰器函数(wrapper)之后的返回的inner还叫qqxing  
def qqxing():    # 4 qqxing()函数“使用”了 wrapper 装饰器
    print(520)
    
res = qqxing()  # 6 而qqxing此刻是inner,因为qqxing = wrapper(qqxing)中执行完wrapper(qqxing)之后返回的qqxing以res接收返回值                                                                                       
print(res)

 

 ?

技术图片

def wrapper(func):
    def inner(*args,**kwargs):
        print(在被装饰的函数执行之前做的事)
        ret = func(*args,**kwargs)
        print(在被装饰的函数执行之后做的事)
        return ret
    return inner  # 把inner的内存地址返回回来,让下一行注释的lover接收
@wrapper          # 等效于lover = wrapper(lover)
def lover(date):
    print(We have been %s days falling in love% date )
    return love story
ret = lover(24)
print(ret)

 

 

def outer(*args,**kwargs):
    print(args)
    print(*args)
    def inner(*args):
        print(inner:,args)
    inner(*args)
outer(1,2,3,4)
# 关于*args,接收就是聚合,调用就是打散

以上是关于装饰器的主要内容,如果未能解决你的问题,请参考以下文章

Python面向对象学习之八,装饰器

thymeleaf 片段渲染后重新加载 javascript

代码缺乏装饰?使用ts装饰器来装饰你的代码

代码缺乏装饰?使用ts装饰器来装饰你的代码

代码缺乏装饰?使用ts装饰器来装饰你的代码

代码缺乏装饰?使用ts装饰器来装饰你的代码