• 完美的装饰器和语法糖


    一、wraps
    一般的装饰器公式:只对原函数加功能,但名字等属性为函数warpper

    无参装饰器:
    def index(func):
        def warpper(*args,**kwargs):
            res=func(*args,**kwargs)
            return res
        return warpper
    @index
    def func(x):
        print(x)
    print(func.__name__)
    ===》warpper
    

    加上wraps全面包装成原函数属性:需要提取模块

    from functools import wraps
    def timmer(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            res = func(*args, **kwargs)
            return
        return wrapper
    @timmer  # index= timmer(index)  # index=wrapper
    def index():
        print('from index')
    print(index.__name__)
    ===>index
    
    wrapper装饰太麻烦了,而且平常没啥用就很少使用。
    

    二、装饰器生成式

    语法糖就是@ 放在被装饰的函数上@后加上装饰器的名字,自动完成包装
    1、有参装饰器公式:

    def outter(x):
        def index(func):
            def warpper(*args,**kwargs):
                print(x)
                res=func(*args,**kwargs)
                print(3)
                return res
            return warpper
        return index
    
    @outter(1)
    def f():
        print(2)
    f()
    ====>
    1
    2
    3
    

    2、多个迭代器的叠加使用:

    
    def outter1(func1):  # func1 = wrapper2的内存地址
        print('============>outter1')
        def wrapper1(*args,**kwargs):
            print('============>wrapper1')
            res1=func1(*args,**kwargs)
            return res1
        return wrapper1
    
    def outter2(func2):  # func2 = wrapper3的内存地址
        print('============>outter2')
        def wrapper2(*args,**kwargs):
            print('============>wrapper2')
            res2=func2(*args,**kwargs)
            return res2
        return wrapper2
    
    
    def outter3(func3):  # func3 = 被装饰函数也就是index的内存地址
        print('============>outter3')
        def wrapper3(*args,**kwargs):
            print('============>wrapper3')
            res3=func3(*args,**kwargs)
            return res3
        return wrapper3
    
              # index = wrapper1的内存地址
    @outter1  # outter1(wrapper2的内存地址)->wrapper1的内存地址
    @outter2  # outter2(wrapper3的内存地址)->wrapper2的内存地址
    @outter3  # outter3(被装饰函数也就是index的内存地址)->wrapper3的内存地址
    def index():
        print('from index')
    ===>>
    ============>outter3
    ============>outter2
    ============>outter1
    
    
  • 相关阅读:
    Leetcode:169. 多数元素
    关系数据库
    数据库系统概述——简单总结
    Leetcode:1305. 两棵二叉搜索树中的所有元素
    Leetcode春季打卡第四天:994. 腐烂的橘子
    临界区和临界资源的关系
    线程2.线程的应用场景
    线程
    linux下的进程控制
    Go中的错误处理
  • 原文地址:https://www.cnblogs.com/qiukangle/p/14098675.html
Copyright © 2020-2023  润新知