python - 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
解决方案
你可以改成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
推荐阅读
- oracle - 我们可以在 Oracle PDB 实例上创建备份作业吗?
- c++ - 用于累积多个传感器浮动数据流的无碎片数据结构
- amazon-web-services - 如何获取弹性beantalk启动的ec2实例的IP地址范围?
- networking - Apache Tomcat 9 上的 504 网关超时
- ffmpeg - Xfade 过滤器不适用于 ffmpeg
- typescript - 是否有脚本或工具可以帮助将 Flow 自动迁移到 TypeScript?
- html - 如何将基础汉堡图标更改为单击时关闭图标(即:移动菜单打开)
- java - 如何将 Text 视图更改为 int 并在数学运算中使用它?
- javascript - GET 请求,等待外部进程完成后再返回响应
- android - 在没有运行时权限的情况下获取 IMEI 号码