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

Python 3.12中继承类的类型提示优化:父类共享方法返回子类实例的正确类型标注

Python 3.12中继承类的类型提示优化:父类共享方法返回子类实例的正确类型标注

我自己定义了一个父类和若干继承自它的子类,这些类本质上是Python模型,用来把JSON或MongoDB中的文档从字典转换成类实例。因此我在父类中实现了一个标准的from_file类方法,子类都没有重写它。我希望完善类型提示,让调用这些类的其他模块能根据调用的类知道返回的实例类型。

父类代码

class ParentDoc(ABC):
    def __init__(self, ver: int = 1) -> None:
        self.ver = ver

    def to_dict(self) -> dict:
        data = self.__dict__.copy()
        data["_class"] = self.__class__.__name__
        return data

    @classmethod
    def from_dict(cls, data: dict) -> ParentDoc:
        return cls(ver=data.get("ver", 1))

    def to_file(self, file_path: str | Path) -> None:
        with open(file_path, "w", encoding="utf8") as json_file:
            json.dump(self.to_dict(), json_file)

    @classmethod
    def from_file(cls, file_path: str | Path) -> ?????:
        with open(file_path, "w", encoding="utf8") as json_file:
            data = create_from_dict(json.load(json_file))
        return data

辅助函数代码

from_file方法中用到的辅助函数如下:

def create_from_dict(data: dict):
    class_name = data.get("_class")
    if class_name == "ParentDoc":
        return ParentDoc.from_dict(data)
    elif class_name == "ChildDoc":
        return ChildDoc.from_dict(data)
    elif class_name == "Child2Doc":
        return Child2Doc.from_dict(data)
    else:
        raise ValueError(f"Unsupported class: {class_name}")

子类示例

所有子类都重写了to_dict和from_dict方法,但没有重写to_file和from_file方法,以下是一个子类的示例:

class ChildDoc(DbDoc):
    def __init__(self, name: str, ver: int = 1) -> None:
        super().__init__(ver=ver)
        self.name = name

    def to_dict(self) -> dict:
        data = super().to_dict()
        data.update({"name": self.name})
        return data

    @classmethod
    def from_dict(cls, data: dict) -> ChildDoc:
        return cls(name=data["name"])

我的问题

我应该在父类from_file方法的返回值位置(即问号处)填什么,才能让调用ChildDoc.from_file(json_path)时,类型提示能识别出返回的是ChildDoc实例而非ParentDoc?目前我没有给输出加类型提示,所以Linter认为返回值可能是父类或任意子类,哪怕我是用特定子类调用的。另外create_from_dict函数的类型提示也可以优化。

我想使用Python 3.12的标准类型提示(不需要导入typing模块),我试过Self但没用。


备注:内容来源于stack exchange,提问作者user2731076

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 11:15:32