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)
一种直接的方式(适用于任何类)是定义__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__.
注意,在使用带槽的继承时必须小心,至少,如果希望子类保留槽行为.