【发布时间】:2022-01-06 11:04:57
【问题描述】:
我有一些需要编组的数据,其中有两种具有一些基本行为的主要类型。为了避免实际上封送数据的所有重复逻辑,我决定使用继承。我认为对象也是一个不错的选择,因为我可以添加类型提示,并使所有参数都成为必需的(比如 dict,这是我们目前使用的,容易出现拼写错误/字段遗漏)。
我也知道TypedDict,但由于有一点点与数据相关的行为,我觉得这不是一个好的选择。 dataclass 似乎是一个很好的中间立场,只是它在继承方面不是很好,并且暴露了一些应该对调用者隐藏的字段。
我真正关心的是强制执行所需的参数和类型。
假设我有这些课程
class Base:
def __init__(self, id: str, **kwargs):
self.id = id # the caller doesn't need to know about this field.
# data really just needs to be collected into this dict with arg names as keys
self.properties = kwargs or {}
class A(Base):
def __init__(self, a: str, b: str, c: datetime):
super().__init__(foo_id, a=a, b=b, c=c)
当有三个参数时这很好,但有些参数有十个,而且只有大量的样板。有没有办法删除所有传递给Base 的arg,或者甚至只是将args 收集到kwargs 中并将其传递下去?
【问题讨论】:
-
这似乎倒退了。通常的建议是,每个类都定义他们期望的特定参数,并接受将传递给
super().__init__的任意关键字参数,假设 somebody 上游想要它们。 -
问题是,谁需要
a、b和c、A或Base?如果A,它应该只是将它们添加到self.properties本身。 (dict保证在super().__init__返回后存在。)
标签: python inheritance keyword-argument python-dataclasses