如何从Odoo中的纯Python类继承来修改方法?

时间:2018-03-01 10:57:31

标签: python python-2.7 odoo-8 odoo

我必须修改Odoo中的方法。问题是包含该方法的类没有像往常一样声明它(它没有使用Odoo API),所以我不知道如何模拟Odoo API的_inherit参数

这是包含方法的类(模块为account_financial_report_webkit,来自OCA):

...
from openerp.addons.account.report.common_report_header \
    import common_report_header

class CommonReportHeaderWebkit(common_report_header):
    ...

我要修改的方法是这个(它在CommonReportHeaderWebkit类中):

def is_initial_balance_enabled(self, main_filter):
    if main_filter not in ('filter_no', 'filter_year', 'filter_period'):
        return False
    return True

要覆盖它,我在自定义模块中进行了猴子修补:

from openerp.addons.account_financial_report_webkit.report.common_reports \
    import CommonReportHeaderWebkit

def is_initial_balance_enabled(self, main_filter):
    if main_filter not in ('filter_no', 'filter_date', 'filter_period'):
        return False
    return True

CommonReportHeaderWebkit.is_initial_balance_enabled = is_initial_balance_enabled

这个工作正常,但问题是这样我会覆盖整个方法而我想使用super,因为现在我必须对其他方法做同样的事情我可以&# 39; t覆盖其整个代码。

有没有人以正确的方式知道如何做到这一点?

1 个答案:

答案 0 :(得分:1)

我不是python的专家,而是我所知道的方法 用作对象,所以我认为这将有效。

    from openerp.addons.account_financial_report_webkit.report.common_reports \
        import CommonReportHeaderWebkit

    # first keep reference to the original method before you lose it.
    _super_is_initial_balance_enabled = CommonReportHeaderWebkit.is_initial_balance_enabled

    def is_initial_balance_enabled(self, main_filter):
        # execute it like super
        return _super_is_initial_balance_enabled(self, main_filter)

    CommonReportHeaderWebkit.is_initial_balance_enabled = is_initial_balance_enabled