Один простой способ (который работает с любым классом) - определить __slots__
:
In [1]: from dataclasses import dataclass
In [2]: @dataclass
...: class Foo:
...: __slots__ = 'bar','baz'
...: bar: int
...: baz: int
...:
In [3]: foo = Foo(42, 88)
In [4]: foo.biz = 10
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-4-d52b60444257> in <module>()
----> 1 foo.biz = 10
AttributeError: 'Foo' object has no attribute 'biz'
Цель слотов - это небольшая оптимизация.Это позволяет экземплярам класса использовать таблицу символов вместо dict
в качестве пространства имен класса.Он немного увеличивает скорость доступа к атрибутам и может значительно улучшить использование памяти для каждого экземпляра (поскольку экземпляр не несет в себе dict
под капотом), однако он запрещает динамическую настройку атрибутов.
Это на самом деле моя любимая функция из __slots__
.
Обратите внимание, что вы должны соблюдать осторожность при использовании наследования со слотами, по крайней мере, если вы хотите, чтобы подклассы сохраняли поведение слотов.