This is the documentation for older versions of Odoo (formerly OpenERP).

See the new Odoo user documentation.

See the new Odoo technical documentation.

Object Inheritance - _inherit

简介

对象可能继承于很多定制的或是特定的模块。这比继承一个对象增加或修改某方面更好。

It is done with:

_inherit='object.name'

对象的扩展

这里继承有两种方式:他们都产生一个新的数据类,它将父类的字段和行为做为自己额外的字段和行为,但是他们在heavy programatical consequences上不同。

例子1中产生一个新的子类叫“custom_material”,当操作network.material的视图或是列表时可以看到或是使用它。这和例子2不同。

这是由于这个新类操作的表格(other.material)是不能被之前的对象“network.material”的视图或列表所识别的。

例子1:

class custom_material(osv.osv):
    _name = 'network.material'
    _inherit = 'network.material'
    _columns = {
        'manuf_warranty': fields.boolean('Manufacturer warranty?'),
    }
    _defaults = {
        'manuf_warranty': lambda *a: False,
    }
    custom_material()

小技巧

Notice

_name == _inherit

这个例子,“custom_material”增加了一个新的字段“manuf_warranty”到对象“network.material”中。这个类的新的实例对运行在父类“network.material”上的视图或列表是可见的。

在面向对象的设计中,这种继承通常称为“类继承(class inheritance)”。子类继承父类的字段和函数。

例子2:

class other_material(osv.osv):
    _name = 'other.material'
    _inherit = 'network.material'
    _columns = {
        'manuf_warranty': fields.boolean('Manufacturer warranty?'),
    }
    _defaults = {
        'manuf_warranty': lambda *a: False,
    }
    other_material()

小技巧

Notice

_name != _inherit

在这个例子中,“other_material”会继承“network.material”的所有字段,它另外会加入一个新的字段“manuf_warranty”。所有这些字段都在表格“other.material”中。这个类的新的实例对运行在父类“network.material”上的视图或列表是不可见的。

这种类型的继承被称为“原型继承(inheritance by prototyping)”。因为新创建的子类拷贝了父类的所有字段。子类继承父类的字段和方法。