首先说下起因,在修改英国会计模块(没错,就是那个安格鲁撒克逊记账模式!)中不符合中国国情的部分供能时,碰到了一个棘手的问题,简单的说就是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)