返回非实例化类类型的类型提示[重复]
Posted
技术标签:
【中文标题】返回非实例化类类型的类型提示[重复]【英文标题】:Type hint for returning non-instantiated class type [duplicate] 【发布时间】:2020-07-24 09:12:48 【问题描述】:我有一种情况,我想返回一个非实例化的类对象,一个类型。我会选择->type
,因为非实例化类的类型是“类型”,但该函数不应该返回“任何类类型”,我只对返回从 A 继承的类类型之一感兴趣,因为在这个类的实例化对象上,我稍后会运行一些特定于它的方法。
为了更好地说明这一点,这里有一个示例代码。问题是在这种情况下可以放置一些合理的类型注释吗?或者如果不是,在这种情况下正确的做法是什么?
class A():
def run(self):
pass
class B(A):
pass
class C(A):
pass
def get_letter_class(condition: str) -> ?:
if condition == 'b':
return B
elif condition == 'c':
return C
class_type = get_letter_class('b')
letter = class_type()
letter.run()
【问题讨论】:
【参考方案1】:如果您的函数应该返回类而不是它们的实例,那么我们可以使用 typing.Type
generic 之类的
from typing import Type
...
def get_letter_class(condition: str) -> Type[A]:
进一步阅读
PEP-484 entry。【讨论】:
感谢您的回答。正如我之前在另一个主题link 中所读到的,Type[A]
也可以指示从 A 继承的类型的实例化对象。我现在正在第二次阅读它。如果我在这里错了,请纠正我,因为现在在你的回答和阅读上面的链接之后,我理解它是这样的:Type[A]
可以表示both.an 类型的实例化对象继承自A
和非实例化类对象本身?它是否正确?对我来说有点不合逻辑为什么他们会那样做 TBH
@tikej: Type[A]
表示作为A
子类的任何类对象(包括A
本身),不是实例,而是类
@tikej:您链接中的答案并未声称Type[A]
接受实例。
感谢您的回答。只是一个附带问题,如果我想提示返回从另一个类继承的实例化对象,应该使用什么?
@tikej:你能提供一个代码示例(因为我不明白)吗?您也可以在 cmets 中提出另一个问题并在此处提及以上是关于返回非实例化类类型的类型提示[重复]的主要内容,如果未能解决你的问题,请参考以下文章