zoukankan      html  css  js  c++  java
  • python中装饰器修复技术

    python装饰器@wraps作用-修复被装饰后的函数名等属性的改变
    Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),

    为了不影响,Python的functools包中提供了一个叫wraps的decorator来消除这样的副作用。写一个decorator的时候,最好在实现之前加上functools的wrap,

    它能保留原有函数的名称和docstring。

    未加@wraps的时候:

    from functools import wraps
    
    
    def wrapper(func):
        # @wraps(func)
        def inner(*args, **kwargs):
            print("装饰器工作中...")
            func(*args, **kwargs)
        return inner
    
    
    @wrapper
    def f1(arg):
        """
        这是一个测试装饰器修复技术的函数
        :param arg: 随便传
        :return: 没有
        """
        print(arg)
    
    f1('呵呵')
    print(f1.__name__,f1.__doc__)
    

    打印结果是:
    在这里插入图片描述

    但是加上@wraps以后:

    from functools import wraps
    
    
    def wrapper(func):
        @wraps(func)
        def inner(*args, **kwargs):
            print("装饰器工作中...")
            func(*args, **kwargs)
        return inner
    
    
    @wrapper
    def f1(arg):
        """
        这是一个测试装饰器修复技术的函数
        :param arg: 随便传
        :return: 没有
        """
        print(arg)
    
    f1('呵呵')
    print(f1.__name__,f1.__doc__)
    

    打印结果是:
    在这里插入图片描述

    其中主要的就是两个变量:

    1、显示 正在执行的函数的名称 f.name
    2、显示 正在执行的函数的注释 f.doc

    简单来说就是:

    如果没使用@wraps,当A调用了装饰器B的话,即使A.name,返回的会是装饰器B的函数名称,而不是A的函数名称
    如果使用了@wraps,当A调用了装饰器B的话,A.__ name__返回的会是A函数的名称,而不是饰器B的名称,
    这也即使常说的@wraps是装饰器的修复技术,
    实际就是修复还原了A的__ name__变量,同理__ doc__变量也是一样。

  • 相关阅读:
    CF809E Surprise me!
    2019-4-12-WPF-绑定的默认模式
    2019-4-12-WPF-绑定的默认模式
    2019-2-28-C#-16-进制字符串转-int-
    2019-2-28-C#-16-进制字符串转-int-
    2019-10-23-WPF-使用-SharpDx-异步渲染
    2019-10-23-WPF-使用-SharpDx-异步渲染
    2019-8-31-ASP.NET-Core-开启后台任务
    2019-8-31-ASP.NET-Core-开启后台任务
    2019-8-24-win10-uwp-读取文本GBK错误
  • 原文地址:https://www.cnblogs.com/djdjdj123/p/12181230.html
Copyright © 2011-2022 走看看