先看看装饰器

# 最简单的装饰器,运行顺序
def w1(func):
    print('装饰器正在装饰....')
    print(func)
    def inner():
        print('正在进行权限验证...')
        func()  # f1()
    return inner
@w1     # 执行到这里就会调用函数w1,并且将f1作为参数传递给w1,并把返回值inner函数赋值给f1
def f1():
    print('正在运行f1...')
@w1
def f2():
    print('正在运行f2...')
f1()
# 多个装饰器装饰同一个函数的运行顺序
def w1(func):
    print('正在用w1进行装饰...')
    print(func)
    def inner():
        print('正在运行w1.inner....')
        return '[w1]' + func() + '[w1]'
    return inner
def w2(func):
    print('正在用w2进行装饰...')
    print(func)
    def inner():
        print('正在运行w2.inner....')
        return '[w2]' + func() + '[w2]'
    return inner
@w1
@w2
def text():
    print('正在运行被装饰的函数...')
    return '流程验证'
print(text)
ret = text()
print(ret)
# 装饰的原函数有参数,那么闭包函数必须保持参数个数一致,并且将参数传递给原方法.
def w1(func):
    print('正在装饰...')
    def inner(haha):
        print('正在运行闭包...')
        func(haha)
    return inner
@w1
def text(name):
    print(f'我叫{name}')

text('李太白')
# 如果装饰的原函数有多个参数或不定长参数
def w1(func):
    print('装饰中..')
    def inner(*args):  # 此处聚合
        print('运行inner..')
        func(*args)    # 此处打散
    return inner
@w1
def sum_(a, b, c):
    print(sum([a, b, c]))
sum_(11, 12, 13)
# 对带返回值的函数进行装饰
def w1(func):
    print('正在装饰...')
    def inner(*args):
        print('正在运行inner...')
        return func(*args)
    return inner
@w1
def sum_(a, b, c):
    print('正在运行函数...')
    return sum([a, b, c])
ret = sum_(1, 2, 3)
print(ret)
# 带参数的装饰器
def w1(name='齐天大圣'):
    print(f'{name}正在运行w1....')
    def w2(func):
        print(f'{name}正在运行w2....')
        def inner():
            print(f'{name}正在运行inner....')
            func()
        return inner
    return w2

@w1('猪八戒')
def text():
    print('正在运行text...')
text()
# 万能装饰器
def wanneng(func):
    def inner(*args, **kwargs):
        return func(*args, **kwargs)
    return inner

@wanneng
def text():
    print('正在运行text..')

@wanneng
def text1(a):
    print(a)
text()
text1(9)
原文地址:https://www.cnblogs.com/zyyhxbs/p/11072982.html