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
相关产品推荐
相关产品推荐

