2016-08-05 46 views
0

我正在尝试使用函数注释,希望我的编辑器能够更好地进行重构。然而,我正在绊倒以下问题:抽象类的子类的函数注释

我有一个抽象基类算法。

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

我也有使用算法

def get_foo(foo_algorithm): 
    return foo_algoritm.foo 

输入foo_algorithm的子类的实例可以是任何算法的子类的实例的功能。我如何明智地注释这个输入?我正在寻找一些线路:

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

但我找不到正确的方法来做到这一点。

+0

你的问题有点不清楚。你说的就好像你的'get_foo'接受'Algorithm'的*子类*,而不是'Algorithm'子类的*实例*。您的代码另有说明;在'__init__'方法中设置'.foo',所以必须是一个实例属性。它不会出现在类对象上。 –

+0

好点,编辑。它确实是我正在使用的实例化的子类。 – Skirrebattie

+0

好吧,我现在已经覆盖了任何一种方式。 –

回答

2

只需使用Algorithm直接:

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

,并自动子类的任何实例都可以接受(isinstance(foo_algorithm, Algorithm)必须是真实的,它适用于一个基类的子类)。

如果只能接受,然后使用Type[Algorithm]的类型提示:

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

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

有时你想讨论类对象,特别是从给定类继承的类对象。这可以拼写为Type[C]其中C是一类。为了澄清:尽管C(当用作注释时)是指类别C的实例,但是Type[C]涉及C的子类。

在这里,我称为类对象,由于.foo是根据代码示例的实例属性;来自Algorithm的类别本身不具有这样的属性。