python基础

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

2019-01-16  本文已影响1人  花间派I风月

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后续代码
上一篇下一篇

猜你喜欢

热点阅读