[Python-de] super()

Thomas Fanslau tfanslau at gmx.de
Wed Sep 4 13:26:12 EDT 2002


(Ich habe die Antwort in zwei Teile aufgeteilt)

Martin v. Loewis schrieb:
> Thomas Fanslau <tfanslau at gmx.de> writes:
>>Übersehe ich hier was wichtiges, oder ist es wirklich so schlimm?
> 
> Wenn Du die Funktionalität "rufe die Funktion für alle Teilklassen
> auf" benötigst, musst Du schreiben
> 
> class A(object):
>     def save_next(self, klasse):
>         try:
>             save = super(klasse, self).save
>         except AttributeError:
>             pass
>         else:
>             save()
> 
>     def save(self):
>         self.save_next(A)
>         print "a"
> 
> class B(object):
>     def save(self):
>         self.save_next(B)
>         print "b"
> 
> class D(B, A):
>     def save(self):
>         self.save_next(D)
>         print "d"
> 
> Beachte, dass es auch in A und B einen save_next-Aufruf gibt, und dass
> der in B tatsächlich auch was macht, nämlich A.save aufzurufen.
> 
> save_next vereinfacht die Notation: eine der gefundenen Basisklassen
> ist ja letztlich auch object, und das hat kein save. 

Kann eigentlich so nicht funktionieren. Wo bekommt den 'B' die 
'save_next'-Methode her? Und was noch wichtiger ist A.save() wird so gar 
nicht aufgerufen, denn selbst wenn save_next() bekannt wäre, wird beim 
Einsatz von super() nur D(B,A) die ERSTE save()-Funktion aufgerufen!

Ich glaube du hast übersehen, das die Vererbung A(object), B(object), 
D(B,A) lautet.

Und mit deiner Lösung handelst du dir auch nur Probleme ein, wenn die 
Vererbung A(object), B(A), C(A), D(B,C) lautet, weil dann in letzten 
Falle save() für A zweimal aufgerufen wird. Im 'Python Cookbook' ist 
deine Lösung unter 5.3 zu finden.

Aber was dort fehlt ist, der Hinweis, die bereits aufgerufenen Klassen 
in ein Dictionary einzutragen und so zu versuchen zu verhindern, das sie 
nochmal aufgerufen werden.

> Ciao,
> Martin





More information about the Python-de mailing list