在Python中调用超类的类方法
我正在开发一个Flask扩展,目的是让Flask支持CouchDB。为了简化这个过程,我创建了一个新的类,继承了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)
我省略了一些内容以简化,但这部分是关键。不过,由于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_
属性并不太满意(虽然这些属性是有文档说明的)。有没有人能提供一个更优雅的解决方案呢?
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()