在openerp开发中使用关键字超级函数有什么用?

时间:2013-11-29 11:10:44

标签: python eclipse openerp

我一直在花时间学习使用Python语言开发OpenERP模块。我找到了一个我没有得到的源代码。我已经尝试了一些来源,但我没有找到任何相关的帮助。 Plz指导我理解这段代码。 代码是

def copy(self, cr, uid, id, default=None, context=None):
        if default is None:
            default = {}
        if context is None:
            context = {}
        default.update({'depreciation_line_ids': [], 'state': 'draft'})
        return super(account_asset_asset, self).copy(cr, uid, id, default, context=context)

Plz尽快回复我。 祝福

1 个答案:

答案 0 :(得分:1)

参考的答案是正确的,只要python中的super的经典用法是正确的,但OpenERP增加了几个自己的曲折。

请记住,所有模型都是从osv.Model(或osv.TransientModel)继承的,所以在上面的代码中调用super(account_asset_asset ...)时,它会在osv.Model上调用copy方法,这是本身只是osv.BaseModel的瘦继承,因此它将被调用的复制方法。

osv.BaseModel.copy中的代码遍历各种已安装的模块,这些模块继承了account_asset_asset并按顺序动态执行复制方法。这通常是最后安装的模块,一直到osv.BaseModel,但你可以使用序列来控制它。

所以..当你重写复制,创建等ORM方法时,超级调用的结果是在先前安装的继承相同模型的模块中调用相同的方法。简而言之,忽略osv.Model的经典Python继承并查看模型上的_inherit变量。

这里有几个问题 - 有时,继承的模型会在方法签名中添加额外的命名参数,因此请确保正确指定命名和未命名的参数。

如果您要复制副本,创建等,请确保您还返回超级调用的结果,否则您将终止继承链。