美文网首页python基础
15.python装饰器进阶之功能与结构

15.python装饰器进阶之功能与结构

作者: 花间派I风月 | 来源:发表于2019-01-16 22:35 被阅读1次

    1. 装饰器的主要功能和装饰器的固定结构

    • 在不改变函数调用方式的基础上在函数的前、后添加功能。

    2. 装饰器的固定格式

    2.1 装饰器的固定格式

    def timer(func):
        def inner(*args,**kwargs):
            '''执行函数之前要做的'''
            re = func(*args,**kwargs)
            '''执行函数之后要做的'''
            return re
        return inner
    

    2.2 wraps版装饰器固定格式

    from functools import wraps
    
    def deco(func):
        @wraps(func) #加在最内层函数正上方
        def wrapper(*args,**kwargs):
            return func(*args,**kwargs)
        return wrapper
    

    3. 带参数的装饰器

    假如你有成千上万个函数使用了一个装饰器,现在你想把这些装饰器都取消掉,你要怎么做?

    一个一个的取消掉? 没日没夜忙活3天。。。

    过两天你领导想通了,再让你加上。。。

    def outer(flag):
        def timer(func):
            def inner(*args,**kwargs):
                if flag:
                    print('''执行函数之前要做的''')
                re = func(*args,**kwargs)
                if flag:
                    print('''执行函数之后要做的''')
                return re
            return inner
        return timer
    
    # False时不装饰,True时装饰
    @outer(False)
    def func():
        print(111)
    
    func()
    

    4. 多个装饰器装饰同一个函数

    def wrapper1(func):
        def inner1():
            print('wrapper1 ,before func')
            func()
            print('wrapper1 ,after func')
        return inner1
    
    def wrapper2(func):
        def inner2():
            print('wrapper2 ,before func')
            func()
            print('wrapper2 ,after func')
        return inner2
    
    @wrapper2
    @wrapper1 # 从下往上执行
    def func():
        print('in f')
    
    func()
    

    当多个装饰器装饰同一个函数时,装饰器的运行顺序是从下到上的,比如上面这个f函数,装饰器运行的顺序应当是wrapper1 ->wrapper2

    分析函数func的运行过程

    1. 传入wrapper1 的方法是func
    2. 传入wrapper2的方法是运行wrapper1返回的inner1
    3. 执行函数func
    4. 执行wrapper1 后续代码
    5. 执行wrapper2后续代码

    相关文章

      网友评论

        本文标题:15.python装饰器进阶之功能与结构

        本文链接:https://www.haomeiwen.com/subject/eorrdqtx.html