返回非实例化类类型的类型提示[重复]

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 中提出另一个问题并在此处提及

以上是关于返回非实例化类类型的类型提示[重复]的主要内容,如果未能解决你的问题,请参考以下文章

python实例化类,数据混乱串内容问题(可变类型属性的初始化)

在Java中获取参数化类的实例[重复]

创建java类并实例化类对象

从类型到实例化对象的 Python 通用类型提示

使用工厂模式按名称实例化类

简单工厂模式