【问题标题】: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()

【问题讨论】:

    标签: python python-3.x oop inheritance type-hinting


    【解决方案1】:

    如果您的函数应该返回类而不是它们的实例,那么我们可以使用 typing.Type generic 之类的

    from typing import Type
    ...
    def get_letter_class(condition: str) -> Type[A]:
    

    进一步阅读

    【讨论】:

    • 感谢您的回答。正如我之前在另一个主题link 中所读到的,Type[A] 也可以指示从 A 继承的类型的实例化对象。我现在正在第二次阅读它。如果我在这里错了,请纠正我,因为现在在你的回答和阅读上面的链接之后,我理解它是这样的:Type[A] 可以表示both.an 类型的实例化对象继承自A 和非实例化类对象本身?它是否正确?对我来说有点不合逻辑为什么他们会那样做 TBH
    • @tikej: Type[A] 表示作为A 子类的任何类对象(包括A 本身),不是实例,而是类
    • @tikej:您链接中的答案并未声称Type[A] 接受实例。
    • 感谢您的回答。只是一个附带问题,如果我想提示返回从另一个类继承的实例化对象,应该使用什么?
    • @tikej:你能提供一个代码示例(因为我不明白)吗?您也可以在 cmets 中提出另一个问题并在此处提及
    猜你喜欢
    • 2015-11-23
    • 2019-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 2017-12-14
    相关资源
    最近更新 更多