0Pricing
Python Academy · 课时

类模式

根据对象属性进行匹配

类模式 是 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. match 和 case 基础
  2. 匹配序列与映射
  3. 类模式
  4. 守卫与通配符
← 返回 Python Academy