0Pricing
Python Academy · Урок

Шаблоны классов

Сопоставляйте атрибуты объектов

«Шаблоны классов» — бесплатный урок Python Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения 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 или иерархий фигур. Они заменяют громоздкие проверки isinstance вместе с доступом к атрибутам.

Сочетание позиционных и именованных шаблонов

В одном шаблоне класса можно сочетать позиционные и именованные вложенные шаблоны, как в вызове функции. Позиционные используют порядок __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__ включает позиционное сопоставление.
  • Шаблоны классов можно вкладывать и использовать для диспетчеризации по иерархиям типов.

Часто задаваемые вопросы

Урок «Шаблоны классов» бесплатный?

Да — полный текст урока «Шаблоны классов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.

Чему я научусь в уроке «Шаблоны классов»?

Сопоставляйте атрибуты объектов Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Python Academy?

Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Шаблоны классов»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Python Academy?

Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Основы match и case
  2. Сопоставление последовательностей и отображений
  3. Шаблоны классов
  4. Защитные условия и подстановочные шаблоны
← Назад к Python Academy