2015-09-22 13 views
5

Lassen Sie sagen, ich habe 3 Klassen: A, B und C. A ist eine Basisklasse für B und B für C-Hierarchie normalerweise hier gehalten wird, aber für eine Methode sollte es anders sein. Für C-Klasse sollte es handeln, wie es von A.Python Erben von einer Klasse, aber überschreiben Methode Aufruf einer anderen Klasse?

Zum Beispiel wie diese vererbt wurde:

class A(object): 
    def m(self): 
     print 'a' 

class B(A): 
    def m(self): 
     super(B, self).m() 
     print 'b' 

class C(B): 
    def m(self): 
     super(A, self).m() 
     print 'c' 

Also im Grunde sollte es so funktionieren:

a = A() 
a.m() 
a 

b = B() 
b.m() 
a 
b 

c = C() 
c.m() 
a 
c 

Aber es geht nicht auf Arbeit für die C-Klasse, weil ich diesen Fehler erhalte:

Um dies für C-Klasse zu lösen, könnte ich von Clas erben s A, aber ich möchte alles von B erben und für diese spezifische Methode m Aufruf Super für Basisklasse A. Ich meine, dass diese Methode eine Ausnahme ist. Oder sollte ich es irgendwie anders für Klasse C nennen, um zu arbeiten?

Wie kann ich das tun?

+1

hast du 'a.m (Selbst-) versuchen' statt mit 'super'? –

+0

@MathiasEttinger nein habe ich nicht, aber jetzt habe ich es ausprobiert und es funktioniert perfekt. Vielen Dank. Sie können es als Antwort veröffentlichen, weil es mein Problem, dass zur Arbeit – Andrius

+0

gelöst, a.m() muss eine Klassenmethode – fixmycode

Antwort

4

Mit dem Aufruf super untersucht Python die Klasse MRO Ihrer Klasse, um festzustellen, welche Klasse beim Aufrufen der gewünschten Funktion verwendet werden soll.

Da dieses Verhalten kurzzuschließen wollen, können Sie die Klasse explizit angeben, können Sie von der Methode verwenden möchten, mit:

class C(B): 
    def m(self): 
     A.m(self) 
     print 'c' 
8

Es gibt in der Tat zwei Möglichkeiten, dieses Problem zu lösen: Sie die Verknüpfung kann rufen zu super() und völlig umgehen MRO wie in Mathias Ettinger Antwort, oder Sie können die richtig Aufruf super() nur erteilen:

class C(B): 
    def m(self): 
     super(B, self).m() 
     print 'c' 

Denken Sie daran, dass super() erwartet als erstes Argument die Klasse, aus der der mro nachschlagen soll. Es ist normalerweise die Klasse, in der der Anruf getätigt wird, aber Sie können eine andere Klasse in der Mro übergeben, wenn Sie möchten.

Verwandte Themen