如何在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
相关产品推荐
相关产品推荐

