以下导致导入错误,因为尚未定义Foo
:
class Foo:
def __init__(self, rhs: Foo):
pass
有没有办法注释rhs
以表明它应该是Foo
的另一个实例?
答案 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!')