python中的装饰器(Decorators)

醉酒当歌 提交于 2020-01-02 15:33:09

一、什么是python装饰器(Decorators)

定义:python的装饰器:装饰原有的函数,用于拓展原来函数功能的一种函数,在不更改原来函数代码的基础上,增加函数的功能。
格式:@ 符号就是装饰器的语法糖,它放在函数开始定义的地方,这样就可以省略最后一步再次赋值的操作。

二 、装饰器返回值及用处

装饰器的返回值也是一个函数/类对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景,装饰器是解决这类问题的绝佳设计。
装饰器的具体详解可学习此链接

三、用法:

1、函数装饰器

用@函数名,装饰器可以嵌套函数,分为装饰器带参数和不带参数的。用法可参照以下代码使用。
代码引用自:

def demo1(demo_name):
    def wrapper(fun):
        print(demo_name, "wrapper")
        fun()
    # end def

    @wrapper
    def test():
        print(demo_name, "test")
    # end def

    test  # 调用test方法,此处不能加()。
# end def(demo)


def demo2(demo_name):  #可以创建嵌套的函数,函数也能返回函数
    def wrapper(func):
        def callback(*args, **kwargs):
            print(demo_name, "callback")
            return func(*args, **kwargs)
        return callback
    # end def

    @wrapper
    def test(item):
        print(demo_name, "test", item)
    # end def

    test("Hello")  # 调用test方法
# end def(demo)


def demo3(demo_name):
    def decorate(tip):
        def wrapper(func):
            def callback(*args, **kwargs):
                print(demo_name, tip)
                return func(*args, **kwargs)
            return callback
        return wrapper
    # end def(decorate)

    @decorate("Something")  # 带参数的装饰器
    def test(item):
        print(demo_name, "test", item)
    # end def

    test("Hello")  # 调用test方法
# end def(demo)


if __name__ == '__main__':
    demo1("demo1")
    print()

    # 被装饰函数传参
    demo2("demo2")
    print()

    # 装饰器传参
    demo3("demo3")
    print()

2、类装饰器:

class Foo(object):
    def __init__(self, func):
        self._func = func

    def __call__(self):
        print ('class decorator runing')
        self._func()
        print ('class decorator ending')

@Foo
def bar():
    print ('bar')

bar()
functools.wraps

代码引用自:

四、装饰器的执行顺序:

一个函数还可以同时定义多个装饰器,从内向外的调用,执行顺序是从里到外,最先调用最里层的装饰器,最后调用最外层的装饰器

@a
@b
@c
def f ():
    pass
等价于:
f = a(b(c(f)))
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!