Search code examples
python-3.xooppython-dataclasses

Python dataclass call parent field from constructor


Is it possible to inherit data class and use parent field in child constructor?

import dataclasses


def get_id():
    return "some unique id"

@dataclasses.dataclass
class Parent:
    name: str
    uid: str = dataclasses.field(default_factory=lambda: get_id())

@dataclasses.dataclass
class Child(Parent):
    dependent_on_id: str = dataclasses.field(default_factory=lambda: f"with {super.uid}")


c = Child(name='x')
print("foo " + c.uid)
print(c.dependent_on_id)

Output:

Traceback (most recent call last):
  File "stack_questions.py", line 17, in <module>
    c = Child(name='x')
  File "<string>", line 5, in __init__
  File "stack_questions.py", line 14, in <lambda>
    dependent_on_id: str = dataclasses.field(default_factory=lambda: f"with {super.uid}")
AttributeError: type object 'super' has no attribute 'uid'

Want Output:

foo some unique id
with foo some unique id

Currently it seems to me that my best solution will be to just do it via composition rather than inhiritence


Solution

  • super doesn't make sense in that context. You can use dataclass' __post_init__ method to set dependent_on_id.

    @dataclasses.dataclass
    class Child(Parent):
        dependent_on_id: str = None 
    
        def __post_init__(self):
            if not self.dependent_on_id:
                self.dependent_on_id = f"with {self.uid}" # you don't need super