Python Glossary English

Python 3.7+dataclassesфункция

@dataclass(frozen=True)

базовый

frozen=True делает экземпляры неизменяемыми (аналог namedtuple) и хэшируемыми.

Синтаксис

@dataclass(frozen=True)
class Pt:
    x: int; y: int

Заморозка поверхностная: сам атрибут переприсвоить нельзя (FrozenInstanceError), но если внутри лежит список, его по-прежнему можно пополнять — и хэш такого объекта сломается. Хэшируемость появляется именно из-за связки frozen=True и eq=True (значение по умолчанию); при обычном eq=True без заморозки dataclass выставляет __hash__ = None, и объект перестаёт годиться в ключи словаря. Менять значения удобно не присваиванием, а dataclasses.replace(), который возвращает новый экземпляр.

Примеры

from dataclasses import dataclass
@dataclass(frozen=True)
class Pt:
    x: int
    y: int
p = Pt(1, 2)
print(p.x)  # → 1
print(hash(p) == hash(Pt(1, 2)))  # → True — замороженный объект хэшируем
d = {p: 'origin'}
print(d[Pt(1, 2)])  # → origin — равные по полям объекты дают один ключ
p.x = 5  # → FrozenInstanceError

См. также

Частые ошибки

Открыть в полном глоссарииdocs.python.orgСообщить о неточности