咔叽游戏

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 393|回复: 0

[python] Python装饰器如何实现修复过程解析

[复制链接]
  • TA的每日心情
    无聊
    2019-5-27 08:20
  • 签到天数: 4 天

    [LV.2]圆转纯熟

    发表于 2020-10-4 12:16:13 | 显示全部楼层 |阅读模式
    Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),
    为了不影响,Python的functools包中提供了一个叫wraps的decorator来消除这样的副作用。写一个decorator的时候,最好在实现之前加上functools的wrap,
    它能保留原有函数的名称和docstring。
    未加@wraps的时候:
    1. from functools import wraps
    2. def wrapper(func):
    3.   # @wraps(func)
    4.   def inner(*args, **kwargs):
    5.     print("装饰器工作中...")
    6.     func(*args, **kwargs)
    7.   return inner
    8. @wrapper
    9. def f1(arg):
    10.   """
    11.   这是一个测试装饰器修复技术的函数
    12.   :param arg: 随便传
    13.   :return: 没有
    14.   """
    15.   print(arg)
    16. f1('呵呵')
    17. print(f1.__name__,f1.__doc__)
    复制代码
    打印结果是:

    Python装饰器如何实现修复过程解析-1.jpg

    但是加上@wraps以后:
    1. from functools import wraps
    2. def wrapper(func):
    3.   @wraps(func)
    4.   def inner(*args, **kwargs):
    5.     print("装饰器工作中...")
    6.     func(*args, **kwargs)
    7.   return inner
    8. @wrapper
    9. def f1(arg):
    10.   """
    11.   这是一个测试装饰器修复技术的函数
    12.   :param arg: 随便传
    13.   :return: 没有
    14.   """
    15.   print(arg)
    16. f1('呵呵')
    17. print(f1.__name__,f1.__doc__)
    复制代码
    打印结果是:

    Python装饰器如何实现修复过程解析-2.jpg

    其中主要的就是两个变量:
    1、显示 正在执行的函数的名称 f.name

    2、显示 正在执行的函数的注释 f.doc
    简单来说就是:
    如果没使用@wraps,当A调用了装饰器B的话,即使A.name,返回的会是装饰器B的函数名称,而不是A的函数名称

    如果使用了@wraps,当A调用了装饰器B的话,A.__ name__返回的会是A函数的名称,而不是饰器B的名称,

    这也即使常说的@wraps是装饰器的修复技术,

    实际就是修复还原了A的__ name__变量,同理__ doc__变量也是一样。
    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持咔叽论坛。

    原文地址:https://www.jb51.net/article/194982.htm

    QQ|免责声明|小黑屋|手机版|Archiver|咔叽游戏

    GMT+8, 2024-3-28 19:21

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表