Шаблоны классов
Сопоставляйте атрибуты объектов
«Шаблоны классов» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Основы match и case
- Сопоставление последовательностей и отображений
- Шаблоны классов
- Защитные условия и подстановочные шаблоны