2016-05-19 9 views
2

Ich habe ein Beispiel. Ich habe zwei Klassen. A ist die Oberklasse von B.Rufen Sie eine Methode aus der Superklasse der Superklasse

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


class B(A): 
    def p(self): 
     print "b" 
     super(A, self).p() 

Jetzt habe ich eine neue Klasse C. Die Klasse C ist das Kind Klasse von B und sollte die Methode p wieder, wie das überschreiben:

class C(B): 
    def p(self): 
     print "c" 
     # here call the method p of the 'supersuper'class A 
     # without calling the method p of the superclass B 
    ... 

Wie kann ich die Methode p() der SuperB in der Klasse C und rufen Sie die Methode überschreiben p() von die supersuperclassAohne die Methode der Oberklasse B aufrufen? Hat jemand eine Idee?

P/S: Der Methodenname muss identisch sein.

+1

Nun, es ist Python, wir sind alle einverstanden Erwachsenen hier, so wird es Ihnen erlauben, etwas wie 'Ap (Selbst) 'oder gehen Sie manuell durch' selbst .__ mro__', aber Ihre Anforderung bricht einige grundlegende Vererbungsregeln und Es wird nicht gut unterstützt. –

+0

Ja, ich weiß, dass es nicht nett ist. Aber ich muss eine Klasse erben, um seine Methode ohne Bearbeitung zu ändern. – qvpham

Antwort

5

Rufen Sie einfach A.p(self) direkt, das ist nicht, was super() entwickelt wurde, um zu unterstützen. Beachten Sie, dass Sie self manuell übergeben müssen, da A.p() eine ungebundene Methode ist.

Sie möchten jedoch Ihr Klassendesign überdenken. Vielleicht möchten Sie Hilfsmethoden einführen; einer von diesen könnte dann von A.p() und C.p(), aber nicht B.p() aufgerufen werden? Auf diese Weise B.p() müsste super().p()überhaupt nicht verwenden, und einfach diese Hilfsmethoden einfach wiederverwenden.

+0

Neulich ist uns bei der Arbeit ein ähnliches Problem aufgefallen - bedingt durch schlechtes Klassen-Design, aber wir haben darüber nachgedacht, so etwas zu tun, nur um durch den Sprint zu kommen. Was würde möglicherweise brechen, wenn Sie in "C" etwas wie "super (B, self) .p()" getan haben, solange Sie nicht mehrfache Vererbung verwenden? (Frage nur, weil ich weiß, dass du es weißt.) –

+2

@ Zwei-BitAlchemist: nichts würde brechen, weil 'A' dann immer die nächste Klasse in der Hierarchie ist. Vorausgesetzt, Sie mixen nie 'A' oder' B' auf der ganzen Linie durch mehrfache Vererbung irgendwo. Explizit ist jedoch definitiv besser als implizit. Wirst du dich daran erinnern, dass 'super (B, selbst)' in einem Jahr beginnt, nach 'A' zu suchen? –

+0

Ich habe mein Programm basierend auf Ihrer Antwort erstellt. Und es funktioniert jetzt. Danke Martijn – qvpham