`attrs` und Vererbung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Dennis89
User
Beiträge: 1516
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo zusammen,

ich spiele gerade etwas mit `rich` und wollte mir nun eine App-Klasse bauen und die soll von `rich.console.Console` erben. Das ist an sich auch kein Problem. Um mit `attrs` fitter zu werden nutze ich das immer gern, wenn ich nichts ernsthaftes programmiere und meine Frage ist nun, ist der Aufruf der `__init__` der Elternklasse so wie im folgenden Minimalbeispiel der einzige und vorgesehene Weg in Verbindung mit `attrs`?
Es geht mir jetzt nicht darum, `super()` zu verwenden (laut eines Blogeintrags, sei das gar nicht so super), sondern ob ich das `__attrs_post_init__` benötige oder ob das irgendwie automagisch auch im Hintergrund funktioniert?

Code: Alles auswählen

#!/usr/bin/env python

from attrs import define, field
from rich.align import Align
from rich.console import Console

BANNER = Align.center(
    "[red b]Test",
    vertical="middle",
)


@define
class App(Console):
    banner = field()

    def __attrs_post_init__(self):
        Console.__init__(self)

    def show_start_screen(self):
        self.print(self.banner)


def main():
    app = App(BANNER)
    app.show_start_screen()


if __name__ == "__main__":
    main()

Danke und Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Sirius3
User
Beiträge: 18250
Registriert: Sonntag 21. Oktober 2012, 17:20

attrs macht viel Magie im Hintergrund, das passt nicht zusammen mit Vererbung von richtigen Klassen.
Zudem ist attrs für reine Datenklassen ohne Nebeneffekten gemacht, UI-Klassen müssen per Definition Nebeneffekte haben.
Also, nicht machen.
Benutzeravatar
Dennis89
User
Beiträge: 1516
Registriert: Freitag 11. Dezember 2020, 15:13

Danke für die Antwort, ich nehme `attrs` wieder raus.
Um welche Nebeneffekte geht es dabei denn?


Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
__blackjack__
User
Beiträge: 13997
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Sirius3: `attrs` ist nicht nur für reine Datenklassen, darum verwende ich das ja, sonst könnte ich ja auch einfach `dataclasses` aus der Standardbibliothek verwenden. Ich vermute mal es war gemeint, dass die Objekte am besten aus Werten erstellt werden die direkt den Zustand ausmachen, ohne das mit denen noch irgend etwas komplexeres passieren sollte. Es gibt zwar die post init-Methode, aber die sollte man in der Regel nicht benötigen.

`attrs` ist nicht gut geeignet wenn man eine eigene `__init__()` benötigt, weil sich dass dann damit in die Quere kommt, dass man bei `attrs` die `__init__()` ”geschenkt” bekommt. Und das ist leider auch immer der Fall wenn man von einer anderen Klasse erbt. Wenn die nicht selbst eine `attrs`-definierte Klasse ist, weiss `attrs` nicht wie und mit welchen Argumenten da die `__init__()` aufgerufen werden muss.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Antworten