Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 具有复杂字段的数据类继承_Python_Python Dataclasses - Fatal编程技术网

Python 具有复杂字段的数据类继承

Python 具有复杂字段的数据类继承,python,python-dataclasses,Python,Python Dataclasses,我希望使用Python中的数据类创建一个基类和几个派生类。这些类将包含复杂的属性,例如字典。我希望派生类只更改基类定义的字典的一部分,这可能吗?还是说我更喜欢普通的旧课程? 代码片段中显示的是当前情况,这在代码复制方面似乎是浪费。 在本例中,我可以定义一个接受单个参数而不是lambdas的函数,但在实际示例中,我必须为每种情况定义一个函数,这将非常麻烦 from dataclasses import dataclass, field @dataclass class BaseDataClas

我希望使用Python中的数据类创建一个基类和几个派生类。这些类将包含复杂的属性,例如字典。我希望派生类只更改基类定义的字典的一部分,这可能吗?还是说我更喜欢普通的旧课程?
代码片段中显示的是当前情况,这在代码复制方面似乎是浪费。
在本例中,我可以定义一个接受单个参数而不是lambdas的函数,但在实际示例中,我必须为每种情况定义一个函数,这将非常麻烦

from dataclasses import dataclass, field


@dataclass
class BaseDataClass:
    simple_field_one: int = 100
    simple_field_two: int = 200
    complex_field: dict = field(default_factory=lambda: {
        'x': 0.1,
        'y': ['a', 'b']
    })


@dataclass
class DerivedDataClass(BaseDataClass):
    simple_field_two: int = 300  # this is easy
    complex_field: dict = field(default_factory=lambda: {
        'x': 0.1,
        'y': ['a', 'c']
    })  # this is wasteful. All I changed was complex_field['y'][1]

我以这种方式非常广泛地使用数据类,它似乎工作得非常好

然而,我所做的一个区别是将复杂字段设置为自己的数据类(请参阅)


你可能想考虑这个方法,看看它可以帮助你减少一些你所看到的冗长。

< P>这可能是显而易见的,但是如果变化很小,那么可以方便地使用<代码>·* PrasyIntIt<<代码>来应用它,而不是重新定义字段:

从数据类导入数据类,字段
@数据类
类BaseDataClass:
简单字段:int=100
简单字段二:int=200
复杂字段:dict=field(默认工厂=lambda:{
“x”:0.1,
‘y’:[‘a’、‘b’]
})
@数据类
类DerivedDataClass(BaseDataClass):
简单字段二:int=300
定义后初始化(自):
self.complex_字段['y'][1]='c'
稍有不同的选择,如果您希望能够在初始化期间控制更新到
复杂\u字段

从数据类导入数据类、字段、InitVar
...
@数据类
类DerivedDataClass(BaseDataClass):
简单字段二:int=300
#这里有一个可变的默认值是可以的,因为它的引用没有保留
#我们在post_init期间不会更改它
复杂更新:InitVar[dict]={'y':['a','c']}
定义后初始化(自我、复杂更新):
self.complex\u field.update(complex\u update)