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

如何重写子类继承方法的返回类型提示?

解决方案

你遇到的问题是因为@overload在非存根(.pyi)文件中仅作为类型提示标记,必须跟随一个未被@overload装饰的实际实现函数,否则运行时会触发NotImplementedError。针对你“仅指定类型、不编写方法代码”的需求,有两种可行方案:

方案一:直接覆盖类型注解并复用父类实现

不需要使用@overload,直接在子类中声明方法的类型签名,然后调用父类的实现即可。这样既满足类型提示需求,又不用编写新的逻辑:

from typing import Any

class A:
    def __init__(self, param) -> None:
        self.param = param

    def get(self) -> Any:
        return self.param

class B(A):
    def __init__(self, param: str) -> None:  # 可给param补充类型提示
        super().__init__(param)

    def get(self) -> str:
        return super().get()  # 复用父类的实现逻辑

test = B('something')
test.get()  # 类型检查器识别返回值为str,运行时正常调用父类方法

方案二:使用存根文件(.pyi)分离类型提示与实现

如果完全不想在子类中编写任何方法代码,可以创建存根文件单独定义类型提示,实际代码文件中只保留必要的继承逻辑:

  1. 创建存根文件example.pyi:
from typing import override
from typing import Any

class A:
    def __init__(self, param: Any) -> None: ...
    def get(self) -> Any: ...

class B(A):
    def __init__(self, param: str) -> None: ...
    @override  # 可选,明确标记覆盖父类方法
    def get(self) -> str: ...
  1. 创建实际代码文件example.py:
class A:
    def __init__(self, param) -> None:
        self.param = param

    def get(self):
        return self.param

class B(A):
    def __init__(self, param):
        super().__init__(param)

# 运行时直接调用父类的get方法,类型检查器会读取存根文件的类型提示
test = B('something')
test.get()

这种方式下,类型检查器会依据存根文件的定义识别B.get()的返回类型为str,而运行时直接使用父类的实现,无需在子类中编写额外代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 22:07:27