如何为动态生成多父类子类的Python函数添加类型提示?
解决方案
首先,利用Python 3.10+支持的**交叉类型(&)**结合TypeVar,可以准确标注combine函数的返回类型,让类型检查器明确返回的类同时是A和B的子类,实例具备两者的所有成员:
from typing import TypeVar A = TypeVar('A') B = TypeVar('B') def combine(a: type[A], b: type[B]) -> type[A & B]: class C(a, b): ... return C class C1: def c1(self) -> str: return 'c1' class C2: def c2(self) -> str: return 'c2' # 类型检查器会正确识别实例同时拥有c1和c2方法 print(combine(C1, C2)().c1()) print(combine(C1, C2)().c2())
关键说明
type[A & B]表示返回的是一个类,该类的实例同时属于A和B类型(即兼具两者的属性和方法)。- 由于你已假设
A和B没有共享方法(避免菱形问题),交叉类型可以安全表示这种"同时属于两个类型"的关系,不会触发类型冲突提示。 - 不需要自定义
__instancecheck__,动态创建的C类本身就是A和B的子类,类型系统可直接识别这一点。
兼容旧Python版本(<3.10)
如果你的Python版本不支持交叉类型,可以通过Protocol模拟类似效果:
from typing import TypeVar, Protocol, Type A = TypeVar('A') B = TypeVar('B') class Combined(Protocol[A, B]): def __getattr__(self, name: str) -> object: ... def combine(a: Type[A], b: Type[B]) -> Type[Combined[A, B]]: class C(a, b): ... return C
这种方式虽不如交叉类型直观,但能让旧版本的类型检查器识别返回实例的成员。
内容的提问来源于stack exchange,提问作者iliya malecki
相关产品推荐
相关产品推荐

