@dataclass Python类中的拼写错误的字段

por*_*ton 0 python python-3.x python-dataclasses

如何在@dataclass-decorated Python类中设置拼写错误的字段时引发异常?

我想要一种实用的方法来做到这一点.我需要写自己的装饰师吗?

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

obj = C()
obj.y = 2  # should raise an exception
Run Code Online (Sandbox Code Playgroud)

jua*_*aga 5

一种直接的方式(适用于任何类)是定义__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'
Run Code Online (Sandbox Code Playgroud)

插槽的目的是作为一个小优化.它允许类的实例使用符号表而不是a dict作为类的命名空间.它略微提高了属性访问的速度,并且可以显着提高每个实例的内存使用量(因为实例不会随身携带dict),但是,它不允许动态属性设置.

其实,这是我最喜欢的功能__slots__.

注意,在使用带槽的继承时必须小心,至少,如果希望子类保留槽行为.