抽象 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 本身不会有这样的属性。
我正在尝试使用函数注释,希望我的编辑器能够更好地进行重构。然而,我遇到了以下问题:
我有一个抽象基础 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]
whereC
is a class. To clarify: whileC
(when used as an annotation) refers to instances of classC
,Type[C]
refers to subclasses ofC
.
这里我调用了 class 对象,因为根据您的代码示例,.foo
是一个实例属性;从 Algorithm
派生的 class 本身不会有这样的属性。