Вызов методов класса суперкласса в Python - PullRequest
3 голосов
/ 12 июня 2010

Я работаю над расширением Flask, которое добавляет поддержку CouchDB для Flask. Чтобы упростить процесс, я выделил подклассы couchdb.mapping.Document, чтобы методы store и load могли использовать текущую локальную базу данных потока. Прямо сейчас мой код выглядит так:

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)

Я оставил некоторые для краткости, но это важная часть. Однако из-за того, как работает метод класса, когда я пытаюсь вызвать этот метод, я получаю сообщение об ошибке

  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)

Я протестировал замену вызова на mapping.Document.load.im_func(cls, db or g.couch, id), и это работает, но я не особенно рад доступу к внутренним атрибутам im_ (даже если они задокументированы). У кого-нибудь есть более элегантный способ справиться с этим?

1 Ответ

7 голосов
/ 12 июня 2010

Я думаю, вам действительно нужно использовать super здесь.В любом случае, это более удобный способ вызова методов суперкласса:

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()
...