Python中调用抽象方法的包装函数如何指定返回类型?
解决Python类型标注问题:Solver返回子类Solution的类型检查
要解决这个类型检查问题,核心是通过泛型类明确每个Solver子类对应的返回Solution子类类型,让类型检查工具能正确推断返回值的具体类型。具体实现如下:
1. 定义绑定Solution的TypeVar
先声明一个TypeVar,限定它只能是Solution及其子类,作为泛型参数的约束:
from abc import ABC, abstractmethod from typing import TypeVar, Generic # 定义绑定到Solution的TypeVar S = TypeVar('S', bound='Solution')
2. 将Solver改为泛型抽象基类
让Solver继承Generic[S],把之前的Solution返回类型替换为泛型参数S,确保solve和_solve方法都明确返回S类型:
class Solution(ABC): @abstractmethod def get_result(self) -> float: pass class AnalyticalSolution(Solution): def get_result(self) -> float: return 0.5 class NumericalSolution(Solution): def get_result(self) -> float: return 0.499 def get_mesh_size(self) -> int: return 100 class Solver(ABC, Generic[S]): def solve(self) -> S: # 共享的预处理逻辑 print("Preprocessing...") # 调用抽象方法_solve,返回具体的Solution子类实例 return self._solve() @abstractmethod def _solve(self) -> S: pass
3. 实现具体Solver子类时指定泛型参数
在定义NumericalSolver时,指定泛型参数为NumericalSolution,这样类型检查工具就能明确它的solve方法返回的是NumericalSolution:
class NumericalSolver(Solver[NumericalSolution]): def _solve(self) -> NumericalSolution: return NumericalSolution() class AnalyticalSolver(Solver[AnalyticalSolution]): def _solve(self) -> AnalyticalSolution: return AnalyticalSolution()
验证类型检查
现在调用NumericalSolver的solve方法后,调用get_mesh_size不会再触发Pylance的类型错误:
solver = NumericalSolver() result = solver.solve() # Pylance能正确识别result是NumericalSolution,支持get_mesh_size方法 print(result.get_mesh_size()) # 类型检查通过
为什么之前的TypeVar方案无效?
之前只在函数签名中使用TypeVar但未将Solver定义为泛型类,导致TypeVar仅出现一次,不符合泛型参数的使用规则。将Solver改为泛型类后,TypeVar会在类继承、方法返回值等多个位置出现,满足类型检查工具的要求。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

