[Python-de] super()

Martin v. Loewis martin at v.loewis.de
Wed Sep 4 09:13:43 EDT 2002


Thomas Fanslau <tfanslau at gmx.de> writes:

> class D(B, A):
> 	def save(self):
> 		super(self.__class__, self).save()
> 		print "d"
> 
> dann wird nur die ERSTE gefundene Funktion aufgerufen. 

Richtig. Allerdings verwendest Du super() hier falsch; richtig lautet
es

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

Wenn super normalerweise self.__class__ benutzen soll, dann wäre das
erste Argument gar nicht erforderlich - super könnte self.__class__ ja
gut selbst ausrechnen.

> Ü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. 

Ciao,
Martin




More information about the Python-de mailing list