Odoo中如何继承一个纯Pythonclass来修改一个方法?
How to inherit from a pure Python class in Odoo to modify a method?
我必须修改Odoo 中的一个方法。问题是包含该方法的 class 没有像往常一样声明(它没有使用 Odoo API),所以我不知道如何模拟 _inherit
参数Odoo API.
这是包含方法的 class(模块是 account_financial_report_webkit
,来自 OCA):
...
from openerp.addons.account.report.common_report_header \
import common_report_header
class CommonReportHeaderWebkit(common_report_header):
...
而我要修改的方法是这个(在CommonReportHeaderWebkit
class里面):
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
,因为现在我必须用其他方法做同样的事情,我不能'不要覆盖它的整个代码。
有谁知道如何以正确的方式做到这一点?
我不是 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
我必须修改Odoo 中的一个方法。问题是包含该方法的 class 没有像往常一样声明(它没有使用 Odoo API),所以我不知道如何模拟 _inherit
参数Odoo API.
这是包含方法的 class(模块是 account_financial_report_webkit
,来自 OCA):
...
from openerp.addons.account.report.common_report_header \
import common_report_header
class CommonReportHeaderWebkit(common_report_header):
...
而我要修改的方法是这个(在CommonReportHeaderWebkit
class里面):
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
,因为现在我必须用其他方法做同样的事情,我不能'不要覆盖它的整个代码。
有谁知道如何以正确的方式做到这一点?
我不是 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