kbr hat geschrieben: Sonntag 26. September 2021, 20:07
To whom it may concern: In keiner der tkinter Basis-Klassen, die seit Python 3 implizit von object erben, wird in "__init__()" "object.__init__(*args, **kwargs)" aufgerufen und die abgeleiteten Klassen reichen "überschüssige" Argumente auch nicht durch. Deshalb funktioniert super() in von tkinter abgeleiteten Klassen allenfalls zufällig, wenn in diesen abgeleiteten Klassen gleichfalls Mehrfachvererbung vorgenommen wird. Daher auch mein früherer Hinweis: tkinter ist nicht für die Verwendung mit super() entworfen.
Wo steht denn, daß object.__init__() aufgerufen werden muß? Davon sehe ich in der Dokumentation von Python irgendwie... nichts. Und ich habe in den letzten Jahren eine ganze Reihe von Vererbungshierarchien mit Python entwickelt, mit und ohne Mehrfachvererbung, mit und ohne Tkinter, und alle funktionieren tadellos auch mit Basisklassen, die weder object.__init__() noch super().__init__() aufrufen. Aber sei's drum, das ist ein anderes Thema, zurück zur eigentlichen Frage.
Wo steht, daß object.__init__() unter Tkinter nicht aufgerufen wird? Ein kurzer Blick in den Code beweist eindeutig das Gegenteil dieser Behauptung, und darum zeigen die Tkinter-Entwickler, wie ich oben verlinkt habe, in ihrer offiziellen Dokumentation auch die Nutzung des super()-Builtin. Richtig ist nämlich: die Klassen von Tkinter erben meistens von tkinter.Widget, einer leeren Klasse, die wie folgt deklariert ist:
(Quelle: tkinter/__init__.py für Python 3.9 unter Kubuntu 20.04 LTS ab Zeile 2590, hier verkürzt dargestellt.)
Das heißt: Widget erbt implizit ohnehin von object (Python 3, ne?) und damit natürlich auch dessen Konstruktor object.__init__(). Zumindest, solange wir uns einig sind, daß eine Kindklasse die Eigenschaften und Methoden ihrer Eltern erbt, wenn die Kindklasse diese nicht überschreibt, oder? Also erbt Widget implizit von object, wie Du, lieber kbr, es ja selbst absolut richtig sagst, und damit erbt Widget eben auch den Konstruktor __init__() von, na? Ja, haargenau: object! Ist das nicht super()?

Und das könnte jeder, der Zugriff auf eine aktuelle Python-Installation mit Tkinter und ein bisschen Ahnung von Pythons Objektorientierung hat, in Sekunden herausfinden.
In diesem Beitrag [1] bemängelt der geschätzte Benutzer "__deets__", daß die Tkinter-Klasse "Button" nicht super().__init__() aufrufen würde, und Du, lieber kbr, schlägst im Prinzip jetzt in dieselbe Kerbe. TATSÄCHLICH erbt die Button-Klasse (selbe Datei wie oben, ab Zeile 2628) aber von? Genau: Widget, und der Konstruktor von Button ruft in Zeile 2650 genau was auf? Richtig, ich zitiere: "Widget.__init__(self, master, 'button', cnf, kw)". Überraschung, dadurch wird automatisch natürlich der Konstruktor von object, also object.__init__() aufgerufen, denn Widget hat ja keinen eigenen eigenen Konstruktor und erbt automatisch den von object. Und ja, natürlich werden dabei auch die Argumente korrekt übergeben! Und jetzt der Clou: da die meisten Klassen von Tkinter von Widget erben, funktioniert das auch überall, und zwar genau so, wie es die Entwickler von Tkinter ja dann auch in ihrer offiziellen Dokumentation beschreiben und zeigen. Trotzdem behauptet der Benutzer "Sirius3" sogar, die Dokumentation sei falsch: [2]! Also der Herr "Sirius3" glaubt tatsächlich sogar, es besser zu wissen als die Entwickler des Tkinter-Pakets... lustig, aber... nein.
An diesen Sachverhalten ändert sich auch dadurch nichts, daß die Teilnehmer hier es trotz meiner wiederholten Fragen nicht geschafft haben, meine Aussagen zu widerlegen und Code zu zeigen, der ihre Behauptungen belegen würde. Stattdessen kapriziert sich der Code, den die Herren hier als "Beweis" gezeigt haben, auf gänzlich andere Themen, nämlich einmal auf die MRO bei der Mehrfachvererbung und der korrekt dokumentierten Funktionalität von super(), und ein anderes Mal auf einen fehlenden bzw. auskommentierten Methodenaufruf, was aber beides gar nicht das Thema war.
Insofern, lieber kbr, so leid es mir tut: Dein Hinweis ist leider, schlicht und ergreifend: falsch, falsch, und nochmal falsch.
Richtig ist: Tkinter funktioniert wunderbar mit super(), so wie es die Tkinter-Entwickler dokumentiert haben, auch wenn Tkinter selbst intern kein super() benutzt, sondern explizite Aufrufe über die Basisklasse. Und dieser Hinweis von insgesamt -- ich habe nochmal nachgelesen -- vier Teilnehmern dieses Threads ist und bleibt falsch, bis es einer der Herren schafft, ein Beispiel in Form von Code zu zeigen. Bis dahin gilt: die Dokumentation und ich lagen und liegen richtig, und die Herren kbr, __blackjack__, __deets__ und Sirius3 lagen und liegen falsch.
[1]
viewtopic.php?f=1&t=52445&start=15#p393141
[2]
viewtopic.php?f=1&t=52445&start=15#p393144