微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python 类型:注释父类返回子类类型对象的最佳方法

如何解决Python 类型:注释父类返回子类类型对象的最佳方法

我有一个像下面这样的基类:

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,我该如何解决

解决方法

您可以将 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 接受一个 BaseClass 并返回一个 BaseClass,而 DerivedClass.get 接受一个 DerivedClass 并返回一个 DerivedClass。运行 mypy 结果:

Success: no issues found in 1 source file

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。