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

Mypy不识别类装饰器添加的方法报错的问题该如何解决

问题本质

这是Mypy的已知功能限制:对于直接修改原类并返回的类装饰器,Mypy的类型推导会优先保留原类的名义类型,不会自动应用装饰器声明的返回类型,因此识别不到装饰器动态添加的add方法。

无需Intersection的解决方案

方案1:显式标注装饰后类的类型

改动最小,仅需要在类定义后补充一行类型标注,强制Mypy将类识别为CanAdd类型,原装饰器逻辑不需要修改:

@can_add
class Foo:
    num: int = 12
Foo: Type[CanAdd]

方案2:返回派生类而非修改原类

调整装饰器实现逻辑,不直接修改原类,而是返回同时继承原类和方法实现Mixin的新类,Mypy可自动推导派生类的完整成员,不需要额外类型标注:

  1. 先将方法实现抽为独立Mixin:
class CanAddMixin:
    def add(self, num: int) -> int:
        return self.num + num
  1. 修改装饰器逻辑:
_HasNumberT = TypeVar("_HasNumberT", bound=HasNumber)
def can_add(cls: Type[_HasNumberT]) -> Type[_HasNumberT]:
    class DecoratedClass(cls, CanAddMixin):
        pass
    return DecoratedClass

该方案运行逻辑和原实现一致,同时Mypy可以自动识别到派生类同时包含原类所有成员和add方法。

方案3:使用处显式标注类型

如果不方便修改类定义和装饰器逻辑,可在实例化位置直接标注实例类型为CanAdd:

foo: CanAdd = Foo()

内容的提问来源于stack exchange,提问作者PIG208

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 17:54:04