You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 21:38:22