【问题标题】:python37: Does @dataset call super.__init__(...)?python37:@dataset 是否调用 super.__init__(...)?
【发布时间】:2020-07-06 03:33:45
【问题描述】:

假设我有一个包含大量输入的复杂类。此类不是数据类。此外,如果我明确导入它,如果我不提供所有参数,我希望它抱怨。

但是,为了接口和简洁的代码,我想为构造函数定义默认值,并将复杂类的参数传递给或多或少的“已定义”字典。

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

@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

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

【问题讨论】:

    标签: python-3.7 python-dataclasses


    【解决方案1】:

    我可能误解了您的用例,但在我看来,继承对于这里的工作来说是错误的工具。简单的@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)
    

    【讨论】:

    • 是的,所以我有很多这样的东西,从我的角度来看,继承的目标是代码压缩。我有重复的代码,并且想在我的数据类中继承重复的代码,仅此而已
    • 也许您可以在帖子中包含要求列表。我现在的理解是 1) 你有一堆数据类 2) 你想强制直接调用 __init__ 以提供所有属性 3) 你想要一个允许一些默认值的单独调用 4) 你想要共享这种模式尽可能少的样板。对吗?
    猜你喜欢
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 2015-12-09
    • 1970-01-01
    • 2017-06-30
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多