如何重写子类继承方法的返回类型提示?
解决方案
你遇到的问题是因为@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)分离类型提示与实现
如果完全不想在子类中编写任何方法代码,可以创建存根文件单独定义类型提示,实际代码文件中只保留必要的继承逻辑:
- 创建存根文件
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: ...
- 创建实际代码文件
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
相关产品推荐
相关产品推荐

