父类含抽象方法时如何初始化子类并规避类型检查错误?
解决方案
问题出在工厂函数的类型标注错误:你的函数返回的是Parent的子类类对象,但原标注-> Parent会让类型检查器误以为返回的是抽象类Parent的实例(或抽象类本身),从而触发实例化抽象类的错误。以下是两种优雅的解决方式:
方式一:使用泛型TypeVar(推荐,适配多子类场景)
先定义一个绑定到Parent的泛型类型变量,明确工厂返回的是Parent的非抽象子类:
from abc import ABC, abstractmethod from typing import TypeVar, Type # 定义绑定到Parent的泛型变量,限制为Parent的子类 ParentSubclass = TypeVar("ParentSubclass", bound=Parent) class Parent(ABC): def __init__(self, common_data): self.common_data = common_data @abstractmethod def only_child_class_implements_it(self) -> int: pass def common_method(self): result = self.only_child_class_implements_it() return process_results(result) # 示例子类 class Child1(Parent): def only_child_class_implements_it(self) -> int: return 1 class Child2(Parent): def only_child_class_implements_it(self) -> int: return 2 # 修改工厂函数的返回类型标注 def module_level_func_get_child_class(input: str) -> Type[ParentSubclass]: if input == "child1": return Child1 elif input == "child2": return Child2 raise ValueError(f"Unsupported input: {input}") # 实例化时类型检查器会正确识别为子类实例 child_instance = module_level_func_get_child_class("child1")(common_data="test") child_instance.common_method()
方式二:直接标注子类联合类型(子类较少时适用)
如果子类数量不多,也可以直接用Union标注返回的子类类型:
from typing import Type, Union def module_level_func_get_child_class(input: str) -> Type[Union[Child1, Child2]]: # 工厂逻辑同上 if input == "child1": return Child1 elif input == "child2": return Child2 raise ValueError(f"Unsupported input: {input}")
两种方式都能保留父类的构造逻辑复用,同时让类型检查器正确识别返回的是可实例化的子类,解决cannot instantiate Parent的类型错误。
内容的提问来源于stack exchange,提问作者user1008636
相关产品推荐
相关产品推荐

