在 Python 的match/case模式匹配中要让自定义类支持位置参数即像case Point(x, y)这样使用关键在于定义一个特殊的类属性__match_args__。 为什么需要__match_args__默认情况下自定义类在模式匹配中不支持位置参数像case MyClass(x, y)这样的写法是无效的。你需要显式地告诉 Python类中的哪些属性应该按什么顺序与位置参数对应起来而__match_args__就是做这个的。 如何定义__match_args____match_args__是一个类属性其值是一个字符串元组元组中的字符串顺序就是位置参数在模式中对应的属性顺序。下面是一个完整的例子class Point: # 1. 定义 __match_args__声明位置参数的顺序 __match_args__ (x, y) def __init__(self, x, y): self.x x self.y y # 现在可以使用位置参数进行模式匹配 def describe_point(point): match point: # 2. 使用位置参数 Point(x, y) case Point(0, 0): print(原点) case Point(0, y): print(fY轴上的点y{y}) case Point(x, 0): print(fX轴上的点x{x}) case Point(x, y): print(f点({x}, {y}))在这个例子中__match_args__ (x, y)告诉 Pythoncase Point(0, 0)中的第一个0会去匹配实例的x属性第二个0会去匹配y属性。 高级用法与注意事项混合使用位置参数和关键字参数你可以在一个模式中同时使用位置参数和关键字参数但位置参数必须放在关键字参数之前。# 位置参数 x, y 在前关键字参数 z 在后 case Point3D(x, y, z0): ...__match_args__不必包含所有属性你可以只列出你希望在模式匹配中通过位置来访问的属性。例如可以只列出类的必需参数而忽略可选参数。匹配失败的情况如果类没有定义__match_args__解析器会报错。此外类模式不仅检查类型还会尝试访问在__match_args__中声明的属性如果实例缺失某个属性匹配也会失败。✨ 数据类与内置类的支持数据类 (dataclass): 使用dataclass装饰器创建的类会自动按照字段定义的顺序生成__match_args__属性开箱即用地支持位置参数匹配。命名元组 (namedtuple):collections.namedtuple和typing.NamedTuple也会自动处理支持位置参数匹配。 总结要让自定义类支持模式匹配的位置参数核心就是定义__match_args__类属性它充当了位置参数与实例属性之间的桥梁提供了灵活且强大的数据解构能力。