如何修改装饰器Logger的get_name方法使__init__正确输出所属类名
解决方案
问题根因
你当前的get_name方法存在逻辑错误:func.__class__取的是函数对象本身的所属类,所有普通函数的__class__.__name__都是固定值function,自然无法拿到__init__所属的业务类名称。
修改方案
Python为所有函数提供了__qualname__属性,该属性会存储函数定义时的完整层级路径:对于定义在类内部的方法,__qualname__的格式为类名.方法名(嵌套类场景下会显示完整层级外层类.嵌套类.方法名),拆分该字符串即可拿到__init__所属的类名。
修改后的Logger类的get_name静态方法代码如下:
@staticmethod def get_name(func): if func.__name__ == '__init__': # 拆分__qualname__取倒数第二个元素,兼容嵌套类场景,拿到方法直接所属的类名 class_name = func.__qualname__.split('.')[-2] return f'__init__ {class_name}' return func.__name__
效果验证
修改后重新执行测试代码,输出将完全符合预期:
>>> test = Tester() INFO: Starting: __init__ Tester. <class '__main__.Tester'> >>> test.func(3) INFO: Starting: func. 9
内容的提问来源于stack exchange,提问作者WolVes
相关产品推荐
相关产品推荐

