我正在尝试在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”类。
答案 0 :(得分:2)
我会继续你提出的解决方案。
它有在数据库上创建a
表的不便,但在我看来这是无关紧要的,因为它不会占用存储空间,因为a
模型不会填充数据。
您还可以尝试另一种选择:仅在继承的模型(示例中为a
)中声明b
类公共列。这在官方模块中使用两种不同的技术:检查crm module,crm_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和其他继承规则。
感谢。