odoo 提供了三種不同的機制以模組化的方式來擴充套件模組:
類繼承(class inheritance):
用來新增功能
新類相容現有的檢視
儲存在同一張表中
原型繼承(prototype inhertiance)
用於拷貝賦值功能
現有檢視忽略新類
儲存在不同的表中
委託繼承(delegation inhertiance)
可以進行多繼承
現有檢視忽略新類
儲存在不同的表中
新例項將包含乙個嵌入的'obj1'例項,其值是同步的。
當_name與_inherit一起使用時,odoo使用已經存在的模型作為base(通過_inherit),建立乙個新的模型。這個新模型將從它的base中獲得所有的字段,方法和元資訊。
class使用它們:inheritance0(models.model):
_name='
inhertiance.0
'name=fields.char()
def call(self):
return self.check("
model 0")
def check(self,s):
return
"this is {} record {}
".format(s,self.name)
class
inhertiance1(models.model):
_name='
inheritance.1
'_inherit='
inheritance.0
'def call(sefl):
return self.check("
model 1
")
a = env['產生結果:inheritance.0
'].create()
a.call()
b = env['
inheritance.1
'].create()
b.call()
this is第二個模型繼承了第乙個模型的check方法和name欄位,但是覆蓋了call方法,像是使用了python標準繼承時一樣。model 0 record a
this
is model 1 record b
當使用_inherit而忽略_name時,這新模型將替代這個已經存在的模型,本質上是就地進行擴充套件。這有利於新增一些新的字段或者方法到已經存在的模型上(被其他模組建立),或者自定義,重新配置它們(例如修改他們的預設排序)。
classextension0(models.model):
_name='
extension.0
'name=fields.char(default="a"
)
class
extension1(models.model):
_inherit='
extension.0
'description=fields.char(default="
extended
")
record=env['產生結果: 第三種繼承機制提供了更多地靈活性(它可以在執行的時候被更改),但是效率不高(less power)。使用_inherits的模型將任何不在當前模型的字段查詢委託"children"模型。這個委託通過引用字段(設定在父模型上)自動執行:extension.0
'.create()]
record.read()[0]
classchild0(models.model):
_name = '
delegation.child0
'field_0 =fields.integer()
class
child1(models.model):
_name = '
delegation.child1
'field_1 =fields.integer()
class
delegating(models.model):
_name = '
delegation.parent
'_inherits =
child0_id = fields.many2one('
delegation.child0
', required=true, ondelete='
cascade')
child1_id = fields.many2one('
delegation.child1
', required=true, ondelete='
cascade
')
record = env['產生結果:delegation.parent
'].create().id,
'child1_id
': env['
delegation.child1
'].create().id,
})record.field_0
record.field_1
0也可以像這樣在委託的字段上直接寫入:1
record.write()注意:在使用委託繼承中,繼承的只有字段,方法不被繼承。
擴充套件方法和繼承
1 擴充套件方法 擴充套件方法的要求 1第乙個引數是要擴充套件或者要操作的型別,這成為 被擴充套件的型別 2為了指定擴充套件方法,要在被擴充套件的型別名稱前面附加this修飾符。3要將方法作為乙個擴充套件方法來方位,要用using指定匯入擴充套件型別的命名空間,或者是擴充套件型別和呼叫 在同乙個命名...
C C 類設計 擴充套件和繼承
繼承是c 程式庫用來提供擴充套件性的主要機制。有時,從乙個類實現繼承是容易的 但某些時候,從乙個類繼承確實很難實現的。類派生的困難程度取決於派生類本身與基類的設計與實現。對於乙個類而言,如果可以容易地從它派生出適當的派生類,我們就稱這個是可以繼承的,之所以說是適當的派生類,因為沒有人會這樣認為 由於...
分類,擴充套件和繼承的區別
1 分類和擴充套件的區別 1 分類 宣告的時候使用格式中括號必須要有分類名稱,建立完成後有兩個資料夾 person action.h person action.m檔案 inte ce 類名 分類名稱 方法宣告 end implementation 類名 分類名稱 方法實現 end 擴充套件 宣告的...