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)

原文地址:https://www.cnblogs.com/kfx2007/p/4065407.html