3 Stimmen

Aufrufen der Klassenmethoden einer Oberklasse in Python

Ich arbeite an einer Flask-Erweiterung, die CouchDB-Unterstützung zu Flask hinzufügt. Um es einfacher zu machen, habe ich eine Subklasse couchdb.mapping.Document so dass die store y load Methoden können die aktuelle thread-lokale Datenbank verwenden. Im Moment sieht mein Code wie folgt aus:

class Document(mapping.Document):
  # rest of the methods omitted for brevity
  @classmethod
  def load(cls, id, db=None):
    return mapping.Document.load(cls, db or g.couch, id)

Der Kürze halber habe ich einiges weggelassen, aber das ist der wichtige Teil. Wenn ich jedoch versuche, diese Methode aufzurufen, erhalte ich aufgrund der Funktionsweise von classmethod die Fehlermeldung

  File "flaskext/couchdb.py", line 187, in load
    return mapping.Document.load(cls, db or g.couch, id)
TypeError: load() takes exactly 3 arguments (4 given)

Ich habe getestet, den Aufruf durch mapping.Document.load.im_func(cls, db or g.couch, id) und es funktioniert, aber ich bin nicht besonders glücklich über den Zugriff auf die interne im_ Attribute (auch wenn sie dokumentiert sind). Hat jemand einen eleganteren Weg, dies zu behandeln?

7voto

Jochen Ritzel Punkte 99416

Ich glaube, Sie müssen tatsächlich die super hier. Das ist sowieso der bessere Weg, um Methoden der Oberklasse aufzurufen:

class A(object):
    @classmethod
    def load(cls):
        return cls

class B(A):
    @classmethod
    def load(cls):
        # return A.load() would simply do "A.load()" and thus return a A
        return super(B, cls).load() # super figures out how to do it right ;-)

print B.load()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X