抽象 class 子 classes 的函数注解

Function annotation for subclasses of abstract class

我正在尝试使用函数注释,希望我的编辑器能够更好地进行重构。然而,我遇到了以下问题:

我有一个抽象基础 class 算法。

class Algorithm(metaclass=ABCMeta):
     def __init__(self):   
          self.foo = 'bar'

我还有一个使用算法

子classes实例的函数
def get_foo(foo_algorithm):
    return foo_algoritm.foo

输入 foo_algorithm 可以是算法的任何子 class 的实例。我如何明智地注释此输入?我正在寻找类似的东西:

def get_foo(foo_algorithm: subclassof(Algorithm)):
    return foo_algoritm.foo

但是我找不到正确的方法。

直接用Algorithm即可:

def get_foo(foo_algorithm: Algorithm):
    return foo_algoritm.foo

并且自动接受子class的任何实例(isinstance(foo_algorithm, Algorithm)必须为真,这适用于基础class的所有子class) .

如果只能接受classes,则使用Type[Algorithm]作为类型提示:

def get_foo(foo_algorithm: Type[Algorithm]):
    return foo_algoritm().foo

参见 PEP 484 的 The type of class objects section -- 类型提示:

Sometimes you want to talk about class objects, in particular class objects that inherit from a given class. This can be spelled as Type[C] where C is a class. To clarify: while C (when used as an annotation) refers to instances of class C, Type[C] refers to subclasses of C.

这里我调用了 class 对象,因为根据您的代码示例,.foo 是一个实例属性;从 Algorithm 派生的 class 本身不会有这样的属性。