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Сообщить о неточности