如何在OpenERP中实现抽象类?

1 投票
5 回答
2062 浏览
提问于 2025-04-17 07:26

我正在尝试在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

根据我的了解,在openerp中并没有特别的抽象类的概念,只有Python中的“抽象基类”这个概念。

如果你查看openerp的代码,特别是在“orm.py”这个文件里,你会发现一些方法标记为“未实现”或者抛出“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" )
2

我觉得你提出的解决方案可以继续使用。虽然这样会在数据库里创建一个 a 表,这有点麻烦,但我认为这没什么大不了的,因为这个 a 模型不会存储任何数据,所以不会占用存储空间。

你也可以尝试另一种方法:只在继承的模型(比如你例子中的 b)中声明 a 类的公共列。这种做法在官方模块中有两种不同的技术:你可以查看 crm 模块,其中 crm_lead 模型是以 Python 风格继承自 crm_case,而 mail_thread 则是以 OpenERP 风格的。

1

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

撰写回答