2016-05-09 5 views
1

Ich wollte durch effektiven Python Buch, und ich fand den folllowing CodeWie wird die Ausführungsreihenfolge festgelegt, wenn die mehrfache Vererbung mit der neuen Stilklasse verwendet wird?

class MyBaseClass(object): 
    def __init__(self, value): 
     self.value = value 
     print "I changed it to MyBaseClass",self.value 

class TimesFiveCorrect(MyBaseClass): 
    def __init__(self, value): 
     super(TimesFiveCorrect, self).__init__(value) 
     self.value *= 5 
     print "I changed it to TimesFiveCorrect ",self.value 

class PlusTwoCorrect(MyBaseClass): 
    def __init__(self, value): 
     super(PlusTwoCorrect, self).__init__(value) 
     self.value += 2 
     print "I changed it to PlusTwoCorrect ",self.value 

class Factor(TimesFiveCorrect, PlusTwoCorrect): 
    def __init__(self, value): 
     super(Factor, self).__init__(value) 
     print "I changed it to Factor ",self.value 

foo = Factor(5) 
from pprint import pprint 
pprint(Factor.mro()) 

Was ich den Wert von foo erwartet 27 (5 * 5 + 2) wäre. Aber es stellt sich heraus, 35 zu sein. Und die Ausgabe folgt

I changed it to MyBaseClass 5 
I changed it to PlusTwoCorrect 7 
I changed it to TimesFiveCorrect 35 
I changed it to Factor 35 
[<class '__main__.Factor'>, 
<class '__main__.TimesFiveCorrect'>, 
<class '__main__.PlusTwoCorrect'>, 
<class '__main__.MyBaseClass'>, 
<type 'object'>] 

ich die MRO verstehen konnte, aber ich habe nicht die Ausführung Bestellung erhalten ... Sollte TimesFiveCorrect nicht zuerst genannt werden?

+1

Mögliches Duplikat von [Wie funktioniert Pythons super() mit Mehrfachvererbung?] (Http://stackoverflow.com/questions/3277367/how-does-pythons-super-work-with-multiple-herheritance) – Hooting

Antwort

2

Aber die MRO ist die Ausführungsreihenfolge, und Ihr Ausdruck erklärt, was vor sich geht.

TimesFiveCorrect wird zuerst genannt. Das erste, was es tut, ist jedoch, die Super-Methode aufzurufen, die in PlusTwoCorrect aufgelöst wird; das wiederum ruft seine Supermethode auf, die in MyBaseClass aufgelöst wird. Nur wenn diese Methoden alle zurückgeben, wird der Wert mutiert und die Druckanweisungen werden ausgeführt.

Wenn Sie das Ergebnis von 27 wollten, können Sie die super() Anrufe an die Ende jeder Methode verschieben. Die Mutation und der Druck würden dann zuerst auftreten, bevor die Super-Methode aufgerufen wird.

+0

Ok Ich verstehe das, aber warum wird Super in TimesFiveCorrect in PlusTwoCorrect aufgelöst? Sollte es nicht zu MyBaseClass gelöst werden? Oder der Aufruf von Super ist in der Reihenfolge der Klassen in der MRO-Liste? Ich dachte, TimesFiveCorrect und PlusTwoCorrect sind nicht verwandt. Aber scheint wie sie sind .. –

+0

Ja das ist * genau * was MRO bedeutet. Und Sie würden wahrscheinlich davon profitieren, Raymond Hettingers klassischen Beitrag [Python's super() als super] zu lesen (https://rhettinger.wordpress.com/2011/05/26/super-considered-super/). –

Verwandte Themen