python - 如何从数据类中动态删除字段?
问题描述
我想继承我的数据类但删除它的一些字段。我怎样才能在运行时做到这一点,所以我不需要一一复制所有成员?
例子:
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
只会具有a
和b
定义。
解决方案
__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 的字典中。
推荐阅读
- scala - 具有继承类的 Scala 模式匹配类型
- python - python manage.py collectstatic - 数字海洋 - Django
- python - 如何解决属性错误:'Cursor' 对象在 pymongo 中没有属性'noCursorTimeout'?
- javascript - 如何使用 vanilla javascript 以编程方式更改 location.href 的值?
- powershell - 当使用 PowerShell 不知道结构时如何迭代 HTTP JSON 响应?
- javascript - 有哪些方法可以减少使用工作线程的 NodeJS 程序的内存使用量?
- django - 如何使用 Mongo 引擎在 Point 字段中存储位置并获取位置附近最近的 5 家餐厅
- c - c TCP中的套接字我如何测试连接?
- macos - macos 上是否有 getcwd() 系统调用之类的东西
- ruby - 如何修复 Mac OS Catalina 10.15.4 上的 RVM 安装错误