• 先看看装饰器


    # 最简单的装饰器,运行顺序
    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)
    
  • 相关阅读:
    UIAction 公共界面访问控制(拦截控制)
    MD5加密
    SVN的简单用法
    Spring AOP基础之JDK动态代理
    Spring中的事务管理模块基础
    Spring添加Junit4支持
    Spring里面dbcp连接池的配置和使用
    vue.js自定义指令详解
    vue input输入框联想
    export ,export default 和 import 区别 以及用法
  • 原文地址:https://www.cnblogs.com/zyyhxbs/p/11072982.html
Copyright © 2020-2023  润新知