在 Python 中使用泛型动态类型化子类

rem*_*pas 4 python generics inheritance subclass python-typing

假设我必须上课。

class A:
    @staticmethod
    def foo():
        pass

class B(A):
    pass
Run Code Online (Sandbox Code Playgroud)

我有某种函数可以根据对象的类型构造对象并调用函数。

def create(cls: Type[A]) -> A:
    cls.foo()
    return cls()
Run Code Online (Sandbox Code Playgroud)

现在我可以对该函数进行以下调用。因为B继承了A一切都很好。

instance_a: A = create(A)
instance_b: B = create(B)
Run Code Online (Sandbox Code Playgroud)

除了后者之外,类型检查将开始抱怨,因为create根据注释返回 的实例A

TypeVar这可以通过如下方式解决。

from typing import Type, TypeVar

T = TypeVar('T')
def create(cls: Type[T]) -> T:
   cls.foo() 
   return cls()
Run Code Online (Sandbox Code Playgroud)

但现在类型检查并没有完成它最初的工作,即保证cls有一个名为 的方法foo。有没有办法指定泛型为某种类型?