From 2a031723eefcf6f1d678bbb4f6018610d43623c4 Mon Sep 17 00:00:00 2001 From: dhoekstra2000 Date: Mon, 10 May 2021 15:30:22 +0200 Subject: [PATCH] bpo-43558: Add note about base class initialization to dataclasses doc (GH-25967) --- Doc/library/dataclasses.rst | 21 +++++++++++++++++++ Misc/ACKS | 1 + .../2021-05-07-12-27-09.bpo-43558.UGhA8R.rst | 2 ++ 3 files changed, 24 insertions(+) create mode 100644 Misc/NEWS.d/next/Documentation/2021-05-07-12-27-09.bpo-43558.UGhA8R.rst diff --git a/Doc/library/dataclasses.rst b/Doc/library/dataclasses.rst index bfba15e96dc..e203a1a2132 100644 --- a/Doc/library/dataclasses.rst +++ b/Doc/library/dataclasses.rst @@ -491,6 +491,27 @@ depend on one or more other fields. For example:: def __post_init__(self): self.c = self.a + self.b +The :meth:`__init__` method generated by :func:`dataclass` does not call base +class :meth:`__init__` methods. If the base class has an :meth:`__init__` method +that has to be called, it is common to call this method in a +:meth:`__post_init__` method:: + + @dataclass + class Rectangle: + height: float + width: float + + @dataclass + class Square(Rectangle): + side: float + + def __post_init__(self): + super().__init__(self.side, self.side) + +Note, however, that in general the dataclass-generated :meth:`__init__` methods +don't need to be called, since the derived dataclass will take care of +initializing all fields of any base class that is a dataclass itself. + See the section below on init-only variables for ways to pass parameters to :meth:`__post_init__`. Also see the warning about how :func:`replace` handles ``init=False`` fields. diff --git a/Misc/ACKS b/Misc/ACKS index 480a486a24c..b023bcb6d72 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -736,6 +736,7 @@ David Hobley Tim Hochberg Benjamin Hodgson Joerg-Cyril Hoehle +Douwe Hoekstra Gregor Hoffleit Chris Hoffman Tim Hoffmann diff --git a/Misc/NEWS.d/next/Documentation/2021-05-07-12-27-09.bpo-43558.UGhA8R.rst b/Misc/NEWS.d/next/Documentation/2021-05-07-12-27-09.bpo-43558.UGhA8R.rst new file mode 100644 index 00000000000..b0ecb171ef7 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2021-05-07-12-27-09.bpo-43558.UGhA8R.rst @@ -0,0 +1,2 @@ +Add the remark to :mod:`dataclasses` documentation that the :meth:`__init__` of any base class +has to be called in :meth:`__post_init__`, along with a code example. \ No newline at end of file