0

Following examples here: Class inheritance in Python 3.7 dataclasses.

I'm trying to use inheritance in Python 3.8 dataclasses.

It works fine when I hardcode "child" class but does not work when I try to dynamically create class on the fly. I'm assuming I am doing something silly.

import types
from dataclasses import dataclass
@dataclass
class ParentBase:
    field_1: str
    field_2: str
@dataclass
class ParentDefaults:
    field_3: str = "foo3"
@dataclass
class Parent(ParentDefaults, ParentBase):
    pass

@dataclass
class ChildBase(ParentBase):
    field_4: str
@dataclass
class ChildDefaults(ParentDefaults):
    field_5: str = "foo5"
@dataclass
class Child(Parent, ChildDefaults, ChildBase):
    pass

parent = {"field_1": "foo1", "field_2": "foo2"}
child = {**parent, **{"field_4": "foo4"}}
Parent(**parent)
Parent(field_1='foo1', field_2='foo2', field_3='foo3')
Child(**child)
Child(field_1='foo1', field_2='foo2', field_4='foo4', field_3='foo3', field_5='foo5')
Child2 = type("Child", (Parent, ChildDefaults, ChildBase), {})
Child2(**child)
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-29-a0b94b0b4899> in <module>
----> 1 Child2(**child)


TypeError: __init__() got an unexpected keyword argument 'field_4'
Child.mro()
[__main__.Child,
 __main__.Parent,
 __main__.ChildDefaults,
 __main__.ParentDefaults,
 __main__.ChildBase,
 __main__.ParentBase,
 object]
Child2.mro()
[__main__.Child,
 __main__.Parent,
 __main__.ChildDefaults,
 __main__.ParentDefaults,
 __main__.ChildBase,
 __main__.ParentBase,
 object]
from dataclasses import fields
[field.name for field in fields(Child)]
['field_1', 'field_2', 'field_4', 'field_3', 'field_5']
[field.name for field in fields(Child2)]
['field_1', 'field_2', 'field_3']
martineau
  • 119,623
  • 25
  • 170
  • 301
mishbah
  • 5,487
  • 5
  • 25
  • 35
  • 1
    Try using [make_dataclass](https://docs.python.org/3/library/dataclasses.html#dataclasses.make_dataclass) instead of `type`? – Iain Shelvington Feb 24 '22 at 11:26
  • why is your code split up into multiple pieces...? Id suggest joining them into one section, unless there's a stylistic need to do otherwise. – rv.kvetch Feb 24 '22 at 15:14

0 Answers0