Was macht super()?

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
nuhakan
User
Beiträge: 51
Registriert: Donnerstag 11. August 2016, 11:42

Hallo,

wieder eine Frage. Ich bin bei dieser Übung seit gestern und verstehe nicht, was super() macht. Leider verstehe ich die Erklärungen von Pydoc und Stackoverflow nicht.

[codebox=python file=Unbenannt.txt]class Parent(object):

def altered(self):
print "PARENT altered()"

class Child(Parent):

def altered(self):
print "CHILD, BEFORE PARENT altered()"
super(Child, self).altered()
print "CHILD, AFTER PARENT altered()"

dad = Parent()
son = Child()

dad.altered()
son.altered()[/code]

Grüße.
Zuletzt geändert von Anonymous am Donnerstag 23. Februar 2017, 23:18, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@nuhakan: An dem Beispiel kann man gar nicht wirklich sehen oder erklären was `super()` macht. Das wird eigentlich erst bei Mehrfachvererbung interessant. Und Mehrfachvererbung macht man in aller Regel nicht, weil es zu kompliziert wird. Also braucht man auch `super()` nicht. Aber wenn man es verwendet, dann muss man es überall in der Hierarchie verwenden, also man kann es dann beispielsweise bei abgeleiteten Klassen nicht einfach traditionell machen. Das ist insgesamt ein ziemliches Schlamassel. Hier wird es genauer und an Beispielen erklärt: Python's Super is nifty, but you can't use it. Ich habe noch nie Code geschrieben bei dem ich es gebraucht hätte.
nuhakan
User
Beiträge: 51
Registriert: Donnerstag 11. August 2016, 11:42

Danke BlackJack,

super() sieht besonders aus und wenn Du es noch nicht gebraucht hast, mache ich mir keine Sorge. Es reicht eine grundlegende Idee davon zu haben. :)

Grüße.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@nuhakan: Wie BlackJack schon schrieb, wird super() erst bei Mehrfachvererbung interessant. Mehrfachvererbung ist ein komplexes Thema und sollte nicht ohne Planung und ein gutes Verständnis von Pythons MRO angegangen werden. Für den Aufruf überladener Methoden ist super() eine gute Lösung, aber naturgemäß gleichfalls komplex. BlackJacks Link beschreibt gut, welche Probleme bei der Nutzung von super() entstehen können, wenn sich der Anwender der hinter super() stehenden Mechanismen nicht vollständig bewusst ist. Als Ergänzung möchte ich Dir einen Artikel von Raymond Hettinger empfehlen, der die Funktion von super() verständlich beschreibt: https://rhettinger.wordpress.com/2011/0 ... red-super/
BlackJack

Vielleicht verständlich, aber das ich jetzt überall in jeder Methode noch ein **kwargs akzeptiere und für Klassen die kein `super()` verwenden, zum Beispiel aus Bibliotheken, Boilerplate-Adapterklassen schreibe, nur damit das mit `super()` dann so ”super” funktioniert, und das wo `super()` nur wirklich sinnvoll ist wenn man Mehrfachvererbung jenseits von einfachen Mixin-Klassen verwendet, äh, nee, ich glaube nicht…
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

BlackJack hat geschrieben:Vielleicht verständlich, aber das ich jetzt überall in jeder Methode noch ein **kwargs akzeptiere ...
Das musst Du ja auch nicht. Wenn Du von den betroffenen Methoden genau weißt, wie deren Signatur ausschaut, brauchst Du nur die MRO zu beachten — Du hast dann später vielleicht etwas mehr Arbeit bei einem möglich Refactoring. Wann man alle Methoden mit super() und **kwargs oder auch Klassen mit Adaptern versieht und wann man getrost darauf verzichten kann, gehört meines Erachtens mit zum Verständnis von super(). Sicher mag der Einsatz Fehlerträchtig sein, dies gilt aber für alles, was ein Anwender nicht richtig verstanden hat. Und wenn Du auf super() verzichten kannst, ist das ja auch ok.
BlackJack

Nur die MRO beachten ist gut. Ich hatte das mal durchgearbeitet und am Ende auch verstanden, aber das war mir zu kompliziert um es tatsächlich zu verwenden. Das Problem hier ist IMHO das es viel zu einfach ist das jemand *denkt* er hätte verstanden was `super()` macht, und das einfach *immer* einsetzt, so wie ``super`` in Java. Ich möchte nicht wissen wie viele Leute denken das wäre wirklich das gleiche.
nuhakan
User
Beiträge: 51
Registriert: Donnerstag 11. August 2016, 11:42

Danke für den Artikel @kbr. :)
Antworten