装饰器

装饰器(Decorator)的作用是可以在不修改原有代码的情况下,为被装饰的对象增加新的功能或者附加限制条件或者帮助输出。

装饰器有很多种,有函数的装饰器,也有类的装饰器

体现设计模式中的装饰模式,强调开放封闭原则(已经实现的功能代码内部不允许被修改,但外部可以被扩展)

最基本的结构:

def outer(func):
    def inner():
        print('认证成功')
        result = func()
        print('日志添加成功')
        return result
    return inner


@outer
def f1():
    print('业务部门1数据接口……')

如上述代码中所示,程序读到@outer时会执行以下步骤:1、将被装饰的函数的名字作为参数传递给装饰器函数;2、装饰器执行其函数内的代码,将返回值赋给被装饰的函数(被装饰的函数名指向新的返回对象)

装饰器内为啥有时会封装一层函数:因为@outer这句代码在程序执行到这里的时候会自动执行outer函数内部的代码,如果不封装就会直接执行,可能会与初衷不符。

被装饰函数的有入参,该如何传递?

样例代码:

def outer(func):
    def inner(username):
        print("认证成功!")
        result = func(username)
        print("日志添加成功")
        return result
    return inner

@outer
def f1(name):
    print("%s 正在连接业务部门1数据接口......"%name)

# 调用方法
f1("jack")

另外注意事项:

1、一个函数可以被多个装饰器装饰。

2、装饰器也可以有自己的参数,样例代码:

# 认证函数
def  auth(request,kargs):
    print("认证成功!")
# 日志函数
def log(request,kargs):
    print("日志添加成功")

# 装饰器函数。接收两个参数,这两个参数应该是某个函数的名字。
def Filter(auth_func,log_func):
    # 第一层封装,f1函数实际上被传递给了main_fuc这个参数
    def outer(main_func):
        # 第二层封装,auth和log函数的参数值被传递到了这里
        def wrapper(request,kargs):
            # 下面代码的判断逻辑不重要,重要的是参数的引用和返回值
            before_result = auth_func(request,kargs)
            if(before_result != None):
                return before_result

            main_result = main_func(request,kargs)
            if(main_result != None):
                return main_result

            after_result = log_func(request,kargs)
            if(after_result != None):
                return after_result

        return wrapper
    return outer
# 注意了,这里的装饰器函数有参数哦,它的意思是先执行filter函数
# 然后将filter函数的返回值作为装饰器函数的名字返回到这里,所以,
# 其实这里,Filter(auth,log) = outer , @Filter(auth,log) =  @outer
@Filter(auth,log)
def f1(name,age):

    print("%s 正在连接业务部门1数据接口......"%name)

# 调用方法
f1("jack",18)

# 运行结果
# 认证成功! 
# jack 
# 正在连接业务部门1数据接口...... 日志添加成功

 

参考:

python 装饰器 - 刘江的python教程 (liujiangblog.com)

理解 Python 装饰器看这一篇就够了 - FooFish

Python(12):Python函数高级(命名空间、作用域、装饰器) - springsnow - 博客园 (cnblogs.com)

posted @ 2023-05-14 23:14  FreeCheng  阅读(77)  评论(0)    收藏  举报