如何在OpenERP上实现抽象类?

时间:2011-12-01 01:40:34

标签: python openerp

我正在尝试在OpenERP 6上实现一个抽象类。但我不知道。例如。我有“a”和“b”类。 “b”类继承“a”(见下面的代码)

class a(osv.osv):
    _name = 'a'
    _columns = {
            'state': fields.selection(A_WORKFLOWS, 'State', readonly=True)
        }

# create an object
a()

class b(osv.osv):
    _name = 'b'
    _inherit='a'
    _columns = {
            'name' : fields.char('Name', size=64, required=True)
        }

# create an object
b()

当我升级数据库中生成的模块“a”类时。我不想要它。我想在OpenERP中使用类似抽象类的“a”类。

5 个答案:

答案 0 :(得分:2)

我会继续你提出的解决方案。 它有在数据库上创建a表的不便,但在我看来这是无关紧要的,因为它不会占用存储空间,因为a模型不会填充数据。

您还可以尝试另一种选择:仅在继承的模型(示例中为a)中声明b类公共列。这在官方模块中使用两种不同的技术:检查crm modulecrm_lead模型,继承python样式的crm_case,以及OpenERP样式的mail_thread

答案 1 :(得分:1)

从OpenERP 6.1(即将发布的版本)开始,openerp.osv.orm提供了一个AbstractModel类。在此之前,通过使用osv_memory作为基类,可以实现您想要的目标。

答案 2 :(得分:0)

如果你想让b级继承你应该做的

class b(a):

答案 3 :(得分:0)

据我所知,在openerp中,除了python“抽象基类”概念之外,abstarct类没有特定的概念。

如果您要签入“orm.py”文件,请在openerp代码中输入。有一些方法带有“Not Impemented”或“raise NotImplementedError”异常,它可以被视为抽象方法,与python代码相同。

所以基本上,你需要使用python概念进行openerp。

您可以通过两种不同的方法实现抽象基类:

<强>一:

使用"abc"

二:

使用“NotImplementedError”异常

class AbstractC(object):
    """abstract base class"""

    def abcMethod(self):
        raise NotImplementedError( "Not implemented in base class, overwite the same method in child class" )

答案 4 :(得分:0)

从OpenERP 6.1我们有AbstractModel class.Sp你可以从Orm继承你的类,make是Abstract。对于像note一样的先前版本,您可以使用osv_memory对象,这是一个非常灵活的选项。

或者无论哪种方式,您都可以创建python类继承的表单对象,然后您可以从osv +对象类继承您的对象。 e.g。

class AbstractClass(object):
    def a():pass
    def b():pass

class RealClass(osv.osv, AbstractClass):
    def a():pass
    def b():pass

在继承时请注意mro和其他继承规则。

感谢。