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

如何在Python中实现类似TypeScript &的类型合并?

在Python中实现类似TypeScript的类型合并效果

Python里实现类似TypeScript中A & B的类型合并,分两种核心场景:静态类型检查的交集类型,和运行时的类成员合并。

1. 静态类型注解:交集类型(Python 3.10+)

从Python 3.10开始,类型注解原生支持用&操作符定义交集类型,和TypeScript的&语义完全一致——仅用于静态类型检查工具(如mypy、pyright),确保变量同时具备两个类型的所有约束成员。

示例代码:

from typing import Protocol

# 定义两个协议类型(描述类型需要具备的成员)
class HasName(Protocol):
    name: str

class HasAge(Protocol):
    age: int

# 定义交集类型:同时满足HasName和HasAge的约束
Person = HasName & HasAge

def greet(person: Person) -> str:
    return f"Hello, {person.name}, you're {person.age} years old!"

# 符合交集类型的实现类
class User:
    def __init__(self, name: str, age: int):
        self.name = name
        self.age = age

# 类型检查工具会验证User是否满足Person的约束
greet(User("Alice", 30))

2. 运行时:合并类的属性与方法

如果需要在运行时实际创建一个包含两个类所有成员的新类,最常用的是多重继承,或者动态生成类。

多重继承方式

class A:
    def method_a(self) -> None:
        print("Executing method A")
    attr_a = "Attribute from A"

class B:
    def method_b(self) -> None:
        print("Executing method B")
    attr_b = "Attribute from B"

# 合并A和B的类,继承两者的所有成员
class Combined(A, B):
    pass

obj = Combined()
obj.method_a()  # 输出: Executing method A
obj.method_b()  # 输出: Executing method B
print(obj.attr_a)  # 输出: Attribute from A
print(obj.attr_b)  # 输出: Attribute from B

注意:如果A和B存在同名方法/属性,Python会按照**方法解析顺序(MRO)**优先使用继承列表中靠前的类的成员。

动态创建类(适合动态合并场景)

如果需要在运行时动态生成合并类,可以使用type()函数:

class A:
    def func_a(self):
        return "Result from A"

class B:
    def func_b(self):
        return "Result from B"

# 动态创建合并类:参数依次为类名、基类元组、类属性字典
CombinedDynamic = type("CombinedDynamic", (A, B), {"extra_attr": "Additional attribute"})

obj = CombinedDynamic()
print(obj.func_a())  # 输出: Result from A
print(obj.func_b())  # 输出: Result from B
print(obj.extra_attr)  # 输出: Additional attribute

内容的提问来源于stack exchange,提问作者Shuzheng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 22:36:10