类模式
根据对象属性进行匹配
类模式 是 CoddyKit 上的免费 Python Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Python Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Python Academy 课程共包含 4 节课。
匹配对象
类模式可以让 match 检查对象的类型,并一步提取它的属性。它们在分支中看起来像构造函数调用。
仅检查类型
带有空括号的类模式会匹配该类的任何实例。
def kind(value):
match value:
case int():
return 'an integer'
case str():
return 'a string'
case _:
return 'something else'
print(kind(5))
print(kind('hi'))
print(kind([1]))按名称捕获属性
在括号内写入 attr=name,即可匹配实例,并将指定属性绑定到一个变量。
from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
p = Point(3, 4)
match p:
case Point(x=px, y=py):
print('point at', px, py)匹配特定属性值
您可以要求某个属性等于一个字面量。这个分支只匹配位于 x 轴上的点。
from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
def describe(p):
match p:
case Point(x=0, y=0):
return 'origin'
case Point(x=x, y=0):
return 'on x-axis at ' + str(x)
case Point():
return 'elsewhere'
print(describe(Point(0, 0)))
print(describe(Point(5, 0)))
print(describe(Point(1, 1)))使用 __match_args__ 进行位置匹配
如果类定义了 __match_args__,您就可以按位置匹配属性。数据类会根据字段顺序自动设置它。
from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
p = Point(3, 4)
match p:
case Point(px, py):
print(px, py)手动定义 __match_args__
对于普通类,请将 __match_args__ 设置为一个元组,其中列出您希望能够按位置访问的属性。
class Point:
__match_args__ = ('x', 'y')
def __init__(self, x, y):
self.x = x
self.y = y
match Point(1, 2):
case Point(a, b):
print(a, b)按类进行分派
类模式可以为一组相关类型构建清晰的分派器,让每种类型分别由自己的分支处理。
from dataclasses import dataclass
@dataclass
class Circle:
radius: float
@dataclass
class Square:
side: float
def area(shape):
match shape:
case Circle(radius=r):
return 3.14159 * r * r
case Square(side=s):
return s * s
print(area(Circle(2)))
print(area(Square(3)))嵌套类模式
类模式可以嵌套。如果某个字段本身是一个对象,就可以使用另一个类模式来匹配它。
from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
@dataclass
class Line:
start: Point
end: Point
line = Line(Point(0, 0), Point(3, 4))
match line:
case Line(start=Point(x=0, y=0), end=Point(x=ex, y=ey)):
print('from origin to', ex, ey)与内置类型组合
内置类型支持一个用于捕获值的单独位置参数。int(n) 会匹配整数,并将其绑定到 n。
def label(value):
match value:
case int(n):
return 'int ' + str(n)
case str(s):
return 'str ' + s
case _:
return 'other'
print(label(7))
print(label('hi'))何时使用类模式
当对象的类型和属性值都会影响逻辑时,可以考虑使用类模式,例如处理事件对象、AST 节点或形状层次结构时。它们可以替代繁琐的实例类型检查和属性访问。
混合位置参数与关键字参数
您可以像函数调用一样,在一个类模式中混合使用位置子模式和关键字子模式。位置子模式使用 __match_args__ 中的顺序;关键字子模式则明确写出属性名称。
from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
z: int
p = Point(1, 2, 3)
match p:
case Point(x, y, z=depth):
print(x, y, depth)快速检查
模式 Point(x=0, y=y) 会匹配什么?
回顾
您学会了根据对象属性进行匹配。
ClassName()会检查类型。attr=name会绑定属性;字面量要求值完全相同。__match_args__支持位置匹配。- 类模式可以嵌套,并能根据类型层次结构进行分派。
常见问题解答
「类模式」课时是免费的吗?
是的 — 「类模式」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Python Academy 课程的其余内容,请升级到 CoddyKit PRO。 Python Academy 课程共包含 4 节课。
「类模式」这节课中我会学到什么?
根据对象属性进行匹配 你通过在浏览器中直接运行的动手代码来练习 Python Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Python Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Python Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「类模式」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Python Academy 课中编写并运行代码吗?
能。每节 Python Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。