1

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

4

5 回答 5

2

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

您也可以尝试另一种选择:a仅在继承模型中声明类公共列(b在您的示例中)。这在官方模块中使用了两种不同的技术:签入crm 模块crm_lead模型,继承crm_casePython 风格和mail_threadOpenERP 风格。

于 2011-12-01T15:01:49.020 回答
1

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

于 2011-12-02T09:05:36.350 回答
0

如果您希望 b 类从 a 继承,您应该这样做

class b(a):
于 2011-12-01T08:22:18.693 回答
0

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

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

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

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

一:

使用“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" )
于 2011-12-01T12:09:17.550 回答
0

从 OpenERP 6.1 开始,我们有了 AbstractModel class.Sp,您可以从 Orm 继承您的类,并使之成为 Abstract。对于前面提到的版本,您可以使用 osv_memory 对象,这是您可以拥有的非常漂亮的选项。

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

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

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

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

谢谢。

于 2012-05-16T09:28:54.053 回答