如何在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
根据我的了解,在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作为基础类来实现你想要的功能。