zoukankan      html  css  js  c++  java
  • 完美的装饰器和语法糖

    一、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
    
    
  • 相关阅读:
    Ubuntu20安装docker
    ubuntu 下mysql 大小写问题
    Tensorflow-常见报错解决方案
    迁移学习(Transfer Learning)
    c#的托管代码和非托管代码的理解
    .net面试题升级版
    ADO.NET知识点
    支持“WeShopDb”上下文的模型已在数据库创建后发生更改。请考虑使用 Code First 迁移更新数据库
    .net 面试题
    6、zookeeper应用场景-分布式唯一ID
  • 原文地址:https://www.cnblogs.com/qiukangle/p/14098675.html
Copyright © 2011-2022 走看看