[issue43835] Dataclasses don't call base class __init__

Eric V. Smith report at bugs.python.org
Tue Apr 13 19:29:32 EDT 2021


Eric V. Smith <eric at trueblade.com> added the comment:

dataclasses doesn't know the signature of the base class's __init__, so it can't know how to call it. I realize you've given an example that would accept any parameters, but that isn't typical.

What if the base class was:

@dataclasses.dataclass
class Foo:
    foo: int
    
    def __init__(self, baz):
        ...
        pass

What would the generated Bar.__init__() look like if it were calling the base class __init__()? What would get passed to baz?

> So if a dataclass uses a custom __init__, all its child classes must also use a custom __init__

This isn't true. The typical way to handle this is for the derived class to add a __post_init__() that calls into the base class's __init__(). This way, you can use the normally generated __init__() in the derived class, yet still call the base class's __init__() (which presumably you have some knowledge of). If that doesn't work for some reason (for example, you strictly require that the base class is initialized before the derived class, for some reason), then yes, you'd need to write a custom __init__() in the derived class. dataclasses isn't designed to handle every case: just the most common ones.

In your case, you could do:

@dataclasses.dataclass
class Bar(Foo):
    bar: int

    def __post_init__(self):
        Foo.__init__(self, baz=self.bar) # or whatever

----------
nosy: +eric.smith

_______________________________________
Python tracker <report at bugs.python.org>
<https://bugs.python.org/issue43835>
_______________________________________


More information about the Python-bugs-list mailing list