2010-06-11 4 views
3

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

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) 

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

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_ (даже если они задокументированы). У кого-нибудь есть более элегантный способ справиться с этим?

ответ

7

Я думаю, вам действительно нужно использовать 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() 
+0

Спасибо. Как «супер» работает всегда было немного непрозрачно для меня. – LeafStorm

Смежные вопросы