代码之家  ›  专栏  ›  技术社区  ›  porton

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

  •  0
  • porton  · 技术社区  · 6 年前

    如何使其在设置拼写错误的字段时引发异常 @dataclass

    我想要一个切实可行的方法。我需要写我自己的装饰吗?

    @dataclass
    class C(object):
        x: int = 1
    
    obj = C()
    obj.y = 2  # should raise an exception
    
    1 回复  |  直到 6 年前
        1
  •  5
  •   juanpa.arrivillaga    6 年前

    任何 类)来定义 __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 作为类的命名空间。它略微提高了属性访问的速度,并且可以显著地提高每个实例的内存使用率(因为实例不携带任何内存) 口述

    这其实是我最喜欢的 属于 .

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

        2
  •  0
  •   Arne    5 年前

    一种方法是将数据类标记为 frozen :

    >>> from dataclasses import dataclass
    >>> @dataclass(frozen=True)
    ... class C:
    ...     x: int = 1
    ...     
    >>> c = C()
    >>> c.y = 1
    Traceback (most recent call last):
      File "<input>", line 1, in <module>
      File "<string>", line 3, in __setattr__
    dataclasses.FrozenInstanceError: cannot assign to field 'y'
    

    但请注意,这会使所有现有属性 x 在这种情况下,也是只读的。