2012-04-08 6 views
1

Ich arbeitete mit Vererbung in WTForms. Ich hatte nächste Klasse:Falsche Klassenvererbung mit self .__ class__?

class MyForm(WTForms): 
    ... 
    def process(self, formdata=formdata, obj=None): 
     super(self.__class__, self).process(formdata=formdata, obj=obj) 

Und ich hatte Fehler (nicht immer, aber in einigen Fällen mit einer ähnlichen Form - es ist noch seltsamer):

Maximum recursion depth have been exceeded

Aber wenn ich habe geändert self.__class__MyForm alles war OK!

Ich verstehe es nicht ... Wie ich weiß, müssen sie Synonyme sein. Was ist los mit dir?

Antwort

5

Sie sind keine Synonyme. self kann jedes Objekt einer Klasse sein, die vonMyForm erbt. Python erstellt nicht automatisch ein neues Objekt der Oberklasse für den Aufruf geerbter Methoden, sondern übergibt das gleiche Objekt (dies würde den Polymorphismus aufheben und keine Verwendung bringen). Und die type()/.__class__ ist offensichtlich die Klasse, die das Objekt ist wirklich eine Instanz von, nicht eine Oberklasse davon (Sie erwarten nicht MyShinyThing().__class__ zu object, oder?). Es wäre wirklich erstaunlich, nicht-idiomatisch und nutzlos, wenn __class__ geändert wird, je nachdem, wo von es zugegriffen wird. Es ist nur Polymorphismus.

Und als das erste Argument super wo ein Indikator ist, sollte (informell: wo Sie sich gerade befinden) in den MRO die Suche nach einem supermethod weiter, vorbei an self.__class__ beginnt immer wieder an der (unmittelbaren) geordnete Klasse von was auch immer Klasse self ist eine Instanz von. Angenommen, die richtigen super Aufrufe an anderer Stelle in der Klassenhierarchie, bringt Sie letztlich zurück zu MyForm.process, und wir haben unsere Endlosschleife.

+0

Hervorragende Erklärung. –