:rtype:指定这是返回对象的类型。
因此,当我在以下代码段中创建对象obj时,我从IDE收到一条警告:cls is not callable,因为IDE期望clsobject类型的SomeAbstractClass,并且我想要SomeAbstractClass本身。
IDE是正确的,因为这是默认行为。但是,如何指定我要返回一个类,而不是一个类的实例?
指定type而不是SomeAbstractClass会有所帮助,但这不是解决方案,因为没有进一步的自省(introspection)。

def class_selector(data):
    """
    :rtype: SomeAbstractClass
    :return: Return some class based on given parameters
    """

    return get_from.get(data.name)
cls = class_selector(data)
obj = cls(data.more_data)
同时,我通过在对象创建后添加""":type: SomeAbstractClass"""来解决此问题,但这并不能消除警告,这是一个肮脏的解决方案。
顺便说一句,我在谈论Python2.x。

最佳答案

至于2020年,唯一可以正常工作的解决方案-使用python3注释:
总的来说这在2020年是完全可以接受的
附加屏幕截图以演示正确的行为。
基本上,def factory(name) -> type[SomeAbstractClass]:def factory(name) -> "type[SomeAbstractClass]":(对于无法导入名称的情况)完全可以正常工作。
仍然无法为较旧的Python版本提供解决方案(即避免使用注释)。但这不是2020年的重大交易
python rtype docstring/用于类工厂/选择器的重组文本-LMLPHP
和文本相同的代码,如果有人想复制粘贴来测试替代方法

class SomeAbstractClass:
    property_by_class = 1
    def __init__(self):
        self.property_by_object = 1


def factory(name) -> type[SomeAbstractClass]:
    hide_it = dict()
    class ActualClassImpl(SomeAbstractClass):
        pass
    hide_it.__setitem__(name, ActualClassImpl)
    return hide_it.__getitem__(name)

if __name__ == '__main__':
    a = factory('testclass')
    by_class_should_be_ok = a.property_by_class
    by_object_should_hint_error = a.property_by_object
    just_like_none_existing_property_hints = a.property_by_object_bad


09-30 11:32