Python类装饰器丢失类标识:求类似functools.wraps的解决方案
解决类装饰器丢失IDE识别信息的问题
问题根源
你当前的装饰器直接返回元类创建的新类,但未同步原类的标识属性(如__name__、__doc__),导致IDE无法正确识别类的元信息;同时原类被错误作为基类传入,进一步干扰了类型推导逻辑。
修正方案
借助functools.update_wrapper(类似wraps的底层实现)同步原类关键属性,同时调整元类创建新类的方式:
import functools def deco(cls): # 仅以Base为基类,原类属性通过命名空间传入 new_cls = Meta(cls.__name__, (Base,), dict(vars(cls))) # 同步原类的标识属性,让IDE正确识别类信息 functools.update_wrapper(new_cls, cls) # 手动同步类型注解(update_wrapper默认不处理该属性) new_cls.__annotations__ = cls.__annotations__ if hasattr(cls, '__annotations__') else {} return new_cls
关键细节
- 移除原类作为基类的传入:之前的
(Base, cls)会让新类冗余继承原类,改为(Base,)仅继承Base即可满足需求。 update_wrapper自动同步__name__、__doc__、__module__、__qualname__,解决悬停显示类名和文档字符串的问题。- 手动同步
__annotations__,确保IDE能识别类的类型注解和成员方法提示。
使用验证
# 基础定义 class Base: def base_func(self): """Base类的示例方法""" pass class Meta(type): pass # 用装饰器简化类定义 @deco class TestClass: """测试类的文档字符串""" def test_func(self): """测试类的示例方法""" pass # 验证属性正确性 print(TestClass.__name__) # 输出 TestClass print(TestClass().__doc__) # 输出 测试类的文档字符串
修改后,VSCode的悬停提示、代码补全都会正常识别TestClass的名称、文档,以及继承自Base的成员。
内容的提问来源于stack exchange,提问作者user22212491
相关产品推荐
相关产品推荐

