假设我有许多输入的复杂类。此类不是数据类。此外,如果我显式导入它,那么如果我不提供所有参数,我希望它抱怨。
但是,为了实现界面连接和简洁的代码,我想为构造函数定义默认值,并将复杂类的参数作为或多或少地传递给'defined'dict。
对于数据类来说,这是一项很好的任务,并且我定义了一个数据类类,其中包含所有带有默认值的参数,并且我对其进行了修改和操作。
@dataclass
ComplicatedClassArgs:
arg1: int
arg2: bool = False
...
我的问题等于:我可以编写以下内容,并期望和/或告诉数据类调用super。init(...)具有我定义的所有命名属性吗?
@dataclass
ComplicatedClassArgs(ComplicatedClass):
arg1: int
arg2: bool = False
def some_meta_arg_manipulation_function(...):
pass
def some_other_arg_related_function(...):
pass
我知道我已经使用数据类入口点组成了更高级的内部类行为?
我可能误解了您的用例,但在我看来,继承是此处工作的错误工具。简单的@classmethod
怎么样?
@dataclass
ComplicatedClassArgs:
arg1: int
arg2: bool
@classmethod
def from_dict(cls, kwargs=None):
""""ComplicatedClassArgs factory.
This method provides sensible default values that
may or may not be replaced through the input kwargs.
"""
if kwargs is None:
kwargs = {}
default_params = {
'arg1': 1,
'arg2': False
}
return cls(**{**default_params, **kwargs})
>>> ComplicatedClassArgs()
Traceback (most recent call last):
...
TypeError: __init__() missing .. required positional arguments
>>> ComplicatedClassArgs.from_dict()
ComplicatedClassArgs(arg1=1, arg2=False)