首页 > 解决方案 > 如何从数据类中动态删除字段?

问题描述

我想继承我的数据类但删除它的一些字段。我怎样才能在运行时做到这一点,所以我不需要一一复制所有成员?

例子:

from dataclasses import dataclass

@dataclass
class A:
    a: int
    b: int
    c: int
    d: int

@remove("c", "d")
class B(A):
    pass

这样A就已经a, b, c, d定义并且B只会具有ab定义。

标签: pythonpython-3.xpython-dataclasses

解决方案


__annotations__我们可以从字典中删除特定字段,也可以__dataclass_fields__使用以下方法重建我们的类dataclasses.make_dataclass

def remove(*fields):
    def _(cls):
        fields_copy = copy.copy(cls.__dataclass_fields__)
        annotations_copy = copy.deepcopy(cls.__annotations__)
        for field in fields:
            del fields_copy[field]
            del annotations_copy[field]
        d_cls = dataclasses.make_dataclass(cls.__name__, annotations_copy)
        d_cls.__dataclass_fields__ = fields_copy
        return d_cls
    return _

请注意,我们复制注释和字段是为了不影响 A。否则它也会从 A 中删除这些字段,并且任何其他尝试继承 A 并再次删除我们已经删除的字段都会导致错误。IE:

from dataclasses import dataclass

@dataclass
class A:
    a: int
    b: int
    c: int
    d: int

@remove("c", "d")
class B(A):
    pass

@remove("b", "c")
class C(A):
    pass

这将给我们一个KeyError,因为我们已经删除了“c”,并且它不再存在于 A 的字典中。


推荐阅读