3

私はCouchDBサポートをFlaskに追加するFlask拡張機能に取り組んでいます。簡単にするcouchdb.mapping.Documentためにstoreloadメソッドが現在のスレッドローカルデータベースを使用できるようにサブクラス化しました。現在、私のコードは次のようになっています。

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_誰かがこれを処理するためのよりエレガントな方法を持っていますか?

4

1 に答える 1

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()
于 2010-06-11T22:47:11.980 に答える