New submission from Paul Pinterits <[email protected]>:
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
@dataclasses.dataclass
class Foo:
foo: int
def __init__(self, *args, **kwargs):
print('Foo.__init__') # This is never printed
@dataclasses.dataclass
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 <[email protected]>
<https://bugs.python.org/issue43835>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com