【问题标题】:Invoking a superclass's class methods in Python在 Python 中调用超类的类方法
【发布时间】:2011-03-02 20:50:07
【问题描述】:

我正在开发一个向 Flask 添加 CouchDB 支持的 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_ 属性并不特别满意(即使它们已记录在案)。有没有人有更优雅的方式来处理这个问题?

【问题讨论】:

    标签: python superclass class-method


    【解决方案1】:

    我认为您实际上需要在这里使用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()
    

    【讨论】:

    • 谢谢。 super 的工作原理对我来说一直有点不透明。
    猜你喜欢
    • 2021-11-10
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    相关资源
    最近更新 更多