Odoo(OpenERP) 多個子類重載同一個父類方法的執行順序及如何調用父類的父類方法

首先說下原由,在修改英國會計模塊(沒錯,就是那個安格魯撒克遜記帳模式!)中不符合中國國情的部分供能時,碰到了一個棘手的問題,簡單的說就是B類繼承它的父類A並重載了A的方法M,同時C類也繼承了A類也重載了方法M,那麼問題來了(嗯?挖掘機技術哪家強?),到底是B的方法起做用仍是C的方法起做用呢?python

咱們一步一步來看一下,首先建一個空模塊,建立一個父類:ui

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

而後咱們建立一個子類B:spa

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

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

此時咱們運行模塊,輸出以下:code

可見,子類覆蓋了父類的M方法,這跟咱們以前的經驗是相符的.blog

繼續建立第三個類C:繼承

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

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

若是咱們此時運行,那麼應該輸出的是'MC Running',由於python再初始化該類文件的時候覆蓋掉了B類的方法.it

若是咱們在B類中調用父類方法M,C類中也調用父類方法,會出現什麼狀況呢?由於B類方法已經被C類方法覆蓋掉了,因此預測輸出結果是'MC Running. M Running'class

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'

結果:test

B的方法也運行了!這說明C類是B的子類,調用C的父類方法時調用了B的方法!說明同一個類的繼承是疊加的.方法

那麼咱們如何不讓B類運行,而讓C類直接調用A的類方法呢?

答案是:在C的內部調用B的方法:

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

相關文章
相關標籤/搜索