Odoo(OpenERP) 多个子类重载同一个父类方法的执行顺序及如何调用父类的父类方法...

首先说下起因,在修改英国会计模块(没错,就是那个安格鲁撒克逊记账模式!)中不符合中国国情的部分供能时,碰到了一个棘手的问题,简单的说就是B类继承它的父类A并重载了A的方法M,同时C类也继承了A类也重载了方法M,那么问题来了(嗯?挖掘机技术哪家强?),究竟是B的方法起作用还是C的方法起作用呢?

我们一步一步来看一下,首先建一个空模块,创建一个父类:

class A(osv.Model):
    _name="test_a"
    
    def M(self,cr,uid,ids,context=None):
        print 'M Running'

然后我们创建一个子类B:

class B(osv.Model):
    _inherit='A'

    def M(self,cr,uid,ids,context=None):
            print 'MB Running'

此时我们运行模块,输出如下:

可见,子类覆盖了父类的M方法,这跟我们之前的经验是相符的.

继续创建第三个类C:

class C(osv.Model):
    _name='A'

    def M(self,cr,uid,ids,context=None):
        print 'MC Running'

如果我们此时运行,那么应该输出的是'MC Running',因为python再初始化该类文件的时候覆盖掉了B类的方法.

如果我们在B类中调用父类方法M,C类中也调用父类方法,会出现什么情况呢?因为B类方法已经被C类方法覆盖掉了,所以预测输出结果是'MC Running. M Running'

class B(osv.Model):
    _inherit='A'

    def M(self,cr,uid,ids,context=None):
            super(B,self).M(cr,uid,ids,context=context)
            print 'MB Running'   
class C(osv.Model):
    _name='A'

    def M(self,cr,uid,ids,context=None):
     super(C,self).M(cr,uid,ids,context=context)
print 'MC Running'

结果:

B的方法也运行了!这说明C类是B的子类,调用C的父类方法时调用了B的方法!说明同一个类的继承是叠加的.

那么我们如何不让B类运行,而让C类直接调用A的类方法呢?

答案是:在C的内部调用B的方法:

super(B,self).M(cr,uid,ids,context)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值