You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为动态生成多父类子类的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 15:12:51