python方法参数注释类

时间:2014-11-27 18:20:47

标签: python annotations

以下导致导入错误,因为尚未定义Foo

class Foo:
    def __init__(self, rhs: Foo):
        pass

有没有办法注释rhs以表明它应该是Foo的另一个实例?

2 个答案:

答案 0 :(得分:1)

不是真的。在像C ++中那样定义类之前,Python无法声明一个类。

如果您只是希望人们看到rhs应该是Foo,那么您可以随时使用字符串文字:

def __init__(self, rhs: 'Foo'):
# or
def __init__(self, rhs: "<class '__main__.Foo'>"):

这使你的意图非常清晰,并且允许你让注释说出你想要的任何内容。

但是,如果您想在Foo __annotations__属性中对Foo.__init__类进行实际引用,则需要在定义类后手动更改此属性:

class Foo:
    def __init__(self, rhs):
        pass

Foo.__init__.__annotations__['rhs'] = Foo
print(Foo.__init__.__annotations__)
# {'rhs': <class '__main__.Foo'>}

但我个人只会使用第一种解决方案。功能注释的主要目的是记录您的功能。因此,执行此操作的字符串文字实现了注释的目的。

答案 1 :(得分:0)

为什么不签入初始化程序:

 if ( not isinstance(rhs, Foo)):
    raise Exception('Not the right class!')