如何在 Python 类型注释中引用“任何子类化父类的对象”?
示例: FooBase
是一个抽象基类,其中 Foo1
、 Foo2
等是子类。我希望函数接受 FooBase
的任何后代。这会做:
def do_something(self, bar:FooBase):
pass
或者这只会接受类 FooBase
的对象,这当然是不可能的,因为 FooBase
是抽象的?在那种情况下,我是否需要构建所有情况的 Union
(求求上帝,我希望不要!),或者我可以通过其他方式抽象地表达这种关系吗?
原文由 Chris vCB 发布,翻译遵循 CC BY-SA 4.0 许可协议
不,这也将接受任何子类。这在 Theory of Type Hinting PEP 中也有说明,特别 是 Gradual Typing 部分的摘要:
在处理类型提示时,请查看它以获取更多指示。
即使您这样做了,所有子类都将从
Union
中消除,并且子类将被跳过。尝试创建Union
你提到:结果应该是
FooBar
。它是一个抽象类的事实在这里没有区别,Python 本身在typing
模块中使用了许多抽象类。以
Sized
abc 为例;使用Sized
暗示函数允许替换任何虚拟子类(定义__len__
的类):