Поля с ошибками в классе Python @dataclass - PullRequest
0 голосов
/ 14 декабря 2018

Как заставить это вызвать исключение при установке полей с ошибками в @dataclass декорированном классе Python?

Я хочу практический способ сделать это.Нужно ли мне писать свой собственный декоратор?

@dataclass
class C(object):
    x: int = 1

obj = C()
obj.y = 2  # should raise an exception

1 Ответ

0 голосов
/ 14 декабря 2018

Один простой способ (который работает с любым классом) - определить __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__.

Обратите внимание, что вы должны соблюдать осторожность при использовании наследования со слотами, по крайней мере, если вы хотите, чтобы подклассы сохраняли поведение слотов.

...