首页 > 解决方案 > Python类型:注释父类返回子类类型对象的最佳方法

问题描述

我有一个 BaseClass 如下:

class BaseClass:
    @classmethod
    def create(cls, arg1: str) -> BaseClass:
        instance = cls(arg1)
        return instance

还有一个像这样的派生类:

class DerivedClass(BaseClass):
    def __init__(self, arg: str) -> None:
        self.arg = arg 

现在当我做

data: DerivedClass = DerivedClass.create('first arg)

mypy 给出以下错误:

"BaseClass" cannot be assigned to declared type "DerivedClass"
"BaseClass" is incompatible with "DerivedClass"

我如何解决它是通过使用typing.cast

data: DerivedClass = cast(
    DerivedClass, 
    DerivedClass.get(derived_class_instance)
)

我应该如何在不使用的情况下解决它typing.cast

标签: pythonmypypython-typing

解决方案


你可以改成BaseClass这样:

T = TypeVar("T")

from typing import TypeVar, Type

class BaseClass:
    @classmethod
    def get(cls: Type[T], instance: T) -> T:
        return instance

这强制成为正在调用类方法instance的类型。get所以BaseClass.get需要 aBaseClass并返回 a BaseClass,而DerivedClass.get需要 aDerivedClass并返回 a DerivedClass。运行mypy结果:

Success: no issues found in 1 source file

推荐阅读