python37:@dataset是否调用super .__ init __(…)?

问题描述 投票:1回答:1

假设我有许多输入的复杂类。此类不是数据类。此外,如果我显式导入它,那么如果我不提供所有参数,我希望它抱怨。

但是,为了实现界面连接和简洁的代码,我想为构造函数定义默认值,并将复杂类的参数作为或多或少地传递给'defined'dict。

对于数据类来说,这是一项很好的任务,并且我定义了一个数据类类,其中包含所有带有默认值的参数,并且我对其进行了修改和操作。

@dataclass
ComplicatedClassArgs:
   arg1: int
   arg2: bool = False
   ...

我的问题等于:我可以编写以下内容,并期望和/或告诉数据类调用super。i​​nit(...)具有我定义的所有命名属性吗?

@dataclass
ComplicatedClassArgs(ComplicatedClass):
    arg1: int
    arg2: bool = False

    def some_meta_arg_manipulation_function(...):
        pass

    def some_other_arg_related_function(...):
        pass

我知道我已经使用数据类入口点组成了更高级的内部类行为?

python-3.7 python-dataclasses
1个回答
0
投票

我可能误解了您的用例,但在我看来,继承是此处工作的错误工具。简单的@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)
© www.soinside.com 2019 - 2024. All rights reserved.