zoukankan      html  css  js  c++  java
  • 解决使用装饰器后函数名称变成inner的情况

    def dynamic_report(target01,target02):
        '''
        带参装饰器
        :param target: 装饰器传进来的参数
        :return:
        '''
        def decorate(fun):
            def inner(*args,**kwargs):
                print('调用时候传进来的参数',target01,target02)
                fun(*args,**kwargs)
                print('调用后传进来的参数',target01,target02)
            return inner
    
        return decorate
    
    @dynamic_report('zxb','zxl')
    def method(a,b):
        print('method方法',a+b)
    
    if __name__ == '__main__':
        method(1,2)
        print(method.__name__)

     method的函数名称为什么变成inner了,因为 #method=decorate(method) 函数返回名称为inner因此我们得到函数的名称就是inner

    解决办法:

      引入import functools 模块 使用装饰器 @functools.wraps(fun),将函数名称传进去就解决了,如下图

    def dynamic_report(target01,target02):
        '''
        带参装饰器
        :param target: 装饰器传进来的参数
        :return:
        '''
        def decorate(fun):
            @functools.wraps(fun)
            def inner(*args,**kwargs):
                print('调用时候传进来的参数',target01,target02)
                fun(*args,**kwargs)
                print('调用后传进来的参数',target01,target02)
            return inner
    
        return decorate
    
    @dynamic_report('zxb','zxl')
    def method(a,b):
        print('method方法',a+b)
    
    if __name__ == '__main__':
        method(1,2)
        print(method.__name__)

  • 相关阅读:
    面试题
    Struts2与Struts1的对比
    【转载】在Linux平台上安装和配置Ruby on Rails详解
    SVN总结
    Web.config文件例子详解
    Web.config文件简介
    在C#中应用哈希表(Hashtable)
    VS2005调试C++
    [Serializable]C#中的对象序列化
    ASP.NET下载文件(弹出打开保存文件对话框)
  • 原文地址:https://www.cnblogs.com/zhuxibo/p/14297709.html
Copyright © 2011-2022 走看看