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

如何为继承functools.cached_property的类添加正确的类型提示?

解决自定义cached_property子类的类型提示问题

这个问题我之前也碰到过,核心原因是没有正确继承cached_property的泛型类型标注,再加上不必要的__get__方法重写,导致Pylance没法推断出被装饰属性的具体返回类型。下面是修复后的方案:

修复方案

你不需要重写__get__方法——父类cached_property已经提供了完整的实现和类型标注。关键是让你的my_property类继承泛型版本的cached_property,这样类型检查器就能正确传递被装饰方法的返回类型信息:

from functools import cached_property
from typing import Generic, TypeVar

# 定义泛型类型变量,用于匹配被装饰方法的返回类型
T = TypeVar('T')

class my_property(cached_property[T], Generic[T]):
    pass  # 不需要任何额外代码,父类的逻辑完全满足需求

class Example:
    @my_property
    def foo(self) -> str:
        # 此处为计算逻辑
        return 'foo'
    
    @cached_property
    def oof(self) -> str:
        return 'oof'

# 现在Pylance会正确识别:
# Example().foo 的类型是 str
# Example().oof 的类型是 str

为什么之前的实现有问题?

  1. 不必要的__get__重写:你重写的__get__方法没有添加类型标注,覆盖了父类自带的正确类型信息,导致类型检查器只能推断返回值为Any。
  2. 缺少泛型继承:原生cached_property是一个泛型类,它会根据被装饰方法的返回类型动态调整自身的类型参数。你的子类没有继承这个泛型特性,所以类型检查器无法关联被装饰方法的返回类型和属性的实际类型。

额外说明

如果你的Python版本低于3.9,可能需要从typing_extensions导入Generic和TypeVar,但VS Code搭配Pylance通常对新版本Python的支持更好,建议使用3.9+版本以获得最佳的类型推断体验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 16:22:38