[Python-de] super()

Thomas Fanslau tfanslau at gmx.de
Tue Sep 3 21:49:45 EDT 2002


Ich bin am Wochenende über die Funktion 'super()' gestolpert. Zuerst 
habe ich mich gefreut und gedacht ich könnte damit einige Konstrukte in 
meinen Sourcen entfernen. Aber irgendwie macht 'super()' gar nicht das 
was ich gedacht habe. Ja, ich möchte sogar fast sagen, ich finde die 
Funktion völlig überflüssig und eher sogar noch gefährlich.

Bis jetzt habe ich für meine Klassen immer zwei Ansätze benutzt, wenn 
ich Funktionen aus Super-Klassen aufrufen musste. Zum einen eine 
Variation des Multicast-Verfahrens aus den Kochrezepten die alle 
gleichnamigen Funktionen in den Superklassen aufrief und zum anderen 
eine Variation desselben Verfahrens bei dem ich die aufzurufenden 
Basisklassen in eine Liste eingetragen habe und im ersten Schritt in 
einem 'assert' sichergestellt habe, das auch nur diese Superklassen die 
aufzurufende Funktion enthalten und im zweiten Schritt diese Funktionen 
dann auch aufrief.

'super()' macht eigentlich nichts davon einfacher. Will ich eine Klasse 
speichern (triviales Beispiel)

class A(object):
	def save(self):
		print "a"

class B(object):
	def save(self):
		print "b"

class D(B, A):
	def save(self):
		super(self.__class__, self).save()
		print "d"

dann wird nur die ERSTE gefundene Funktion aufgerufen. Füge ich beim 
Refactoring eine weitere Basisklasse hinzu oder vertausche die 
Reihenfolge der Klassen, dann läuft der Code wie gehabt weiter und ich 
stosse erst später auf den Fehler. Will ich aber die zweite 
'save()'-Funktion aufrufen, dann muss ich das wieder explizit über den 
Namen der Superclasse tun. Wird jetzt die Reihenfolge der Klassen 
getauscht, dann wird ggf. dieselbe Funktion zweimal aufgerufen!!!

Übersehe ich hier was wichtiges, oder ist es wirklich so schlimm?

--tf





More information about the Python-de mailing list