繼承和擴充套件

2022-09-01 14:57:14 字數 2883 閱讀 7187

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

model 0 record a

this

is model 1 record b

第二個模型繼承了第乙個模型的check方法和name欄位,但是覆蓋了call方法,像是使用了python標準繼承時一樣。

當使用_inherit而忽略_name時,這新模型將替代這個已經存在的模型,本質上是就地進行擴充套件。這有利於新增一些新的字段或者方法到已經存在的模型上(被其他模組建立),或者自定義,重新配置它們(例如修改他們的預設排序)。

class

extension0(models.model):

_name='

extension.0

'name=fields.char(default="a"

)

class

extension1(models.model):

_inherit='

extension.0

'description=fields.char(default="

extended

")

record=env['

extension.0

'.create()]

record.read()[0]

產生結果:

第三種繼承機制提供了更多地靈活性(它可以在執行的時候被更改),但是效率不高(less power)。使用_inherits的模型將任何不在當前模型的字段查詢委託"children"模型。這個委託通過引用字段(設定在父模型上)自動執行:

class

child0(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 擴充套件 宣告的...