多继承场景下Python函数参数的类型注解方案问询
解决方案
针对你的问题,有两种实用的方案可以满足需求,避免代码重复且无需维护冗长的Union列表:
方案1:Python 3.10+ 原生交集类型
Python 3.10及以上版本支持交集类型语法A & D,直接用它作为类型注解即可,无需额外定义类或协议:
class A: def f(self): pass class B(A): pass class C(A): pass class D: def g(self): pass class E(B,D): pass class F(C,D): pass def h(obj: A & D): pass
类型检查器会自动识别obj需要同时是A和D的实例,新增符合条件的子类时无需修改注解。
方案2:兼容Python 3.8及以下版本的公共基类
如果需要兼容更早的Python版本,可以定义一个空的公共基类,让所有同时继承A和D的子类都继承它:
class A: def f(self): pass class B(A): pass class C(A): pass class D: def g(self): pass # 定义公共基类,继承A和D class AandD(A, D): pass # 修改子类继承结构,新增子类时只需继承AandD即可 class E(B, AandD): pass class F(C, AandD): pass def h(obj: AandD): pass
这个方案利用了Python的多继承特性,AandD自动继承了A和D的所有方法,无需重复定义。后续新增同时继承A和D的子类时,只需让它继承AandD,函数h的注解无需任何修改。
内容的提问来源于stack exchange,提问作者V T
相关产品推荐
相关产品推荐

