[New-bugs-announce] [issue43835] Dataclasses don't call base class __init__

Paul Pinterits report at bugs.python.org
Tue Apr 13 18:21:40 EDT 2021

New submission from Paul Pinterits <rawing7 at gmail.com>:

It's documented behavior that @dataclass won't generate an __init__ method if the class already defines one. It's also documented that a dataclass may inherit from another dataclass.

But what happens if you inherit from a dataclass that implements a custom __init__? Well, that custom __init__ is never called:

import dataclasses

class Foo:
    foo: int
    def __init__(self, *args, **kwargs):
        print('Foo.__init__')  # This is never printed

class Bar(Foo):
    bar: int

obj = Bar(1, 2)
print(vars(obj))  # {'foo': 1, 'bar': 2}

So if a dataclass uses a custom __init__, all its child classes must also use a custom __init__. This is 1) incredibly inconvenient, and 2) bad OOP. A child class should (almost) always chain-call its base class's __init__.

components: Library (Lib)
messages: 391006
nosy: Paul Pinterits
priority: normal
severity: normal
status: open
title: Dataclasses don't call base class __init__
versions: Python 3.10, Python 3.7, Python 3.8, Python 3.9

Python tracker <report at bugs.python.org>

More information about the New-bugs-announce mailing list