python - Python 类型提示:基于属性的返回类型
问题描述
尝试类型提示,但我在解决某些问题时遇到了一些麻烦:
class Node(object):
credentials_class = credentials.BaseCredentials
@property
def credentials_instance(self) -> [credentials_class]:
return self.credentials_class(self.credentials_data)
class OtherNode(Node):
credentials_class = credentials.OtherCredentials # subclass of BaseCredentials
我怎样才能使它OtherNode().credentials_instance
返回中指定的类型credentials_class
,对于所有子类Node
?
该credentials_class
属性不是必需的,如果我有其他方式告诉系统“此节点的 credentials_instance 属性返回此实例类型”,那很好。
解决方案
答案是泛型。通过Node
使用凭证类进行通用和参数化,您可以指定您希望它们工作的类型。缺点是,最顶层的类不能为 分配默认值credentials_class
,因为它会与它的泛型相冲突。
from typing import Type, Generic, TypeVar
CredentialsClassT = TypeVar("CredentialsClassT", bound=credentials.BaseCredentials)
class Node(Generic[CredentialsClassT]):
credentials_class: Type[CredentialsClassT]
@property
def credentials_instance(self) -> CredentialsClassT:
return self.credentials_class(self.credentials_data)
# example usage
class BaseNode(Node[credentials.BaseCredentials]):
credentials_class = credentials.BaseCredentials
class OtherNode(Node[credentials.OtherCredentials]):
credentials_class = credentials.OtherCredentials # subclass of BaseCredentials
输入到位,例如。
reveal_type(OtherNode.credentials_instance)
将使 MyPynot: Revealed type is 'credentials.OtherCredentials'
按预期打印。
推荐阅读
- java - 是否有一个 Observable 可以发出多个 0 参数?
- java - 我要 Toast 会在多次点击后显示
- sql-server - 错误“'@part1' sql server 附近的语法不正确
- r - GLM & LM 假设和解释
- c - Openmp 在调用指定函数时的不良行为
- r - data.table 通过引用分配修改了错误的对象
- vue.js - 如何通过 HTTPS 为 Vue 应用程序提供本地开发服务
- javascript - 为什么在promise的异步函数中有while循环时JS会停止执行主线程?
- javascript - 如何使用 jquery 访问全局对象中的 ajax 响应数据?
- python - Django Rest Framework - 每个实例的最新子