Odoo(OpenERP) 多个子类重载同一个父类方法的执行顺序及如何调用父类的父类方法
首先说下起因,在修改英国会计模块(没错,就是那个安格鲁撒克逊记账模式!)中不符合中国国情的部分供能时,碰到了一个棘手的问题,简单的说就是B类继承它的父类A并重载了A的方法M,同时C类也继承了A类也重载了方法M,那么问题来了(嗯?挖掘机技术哪家强?),究竟是B的方法起作用还是C的方法起作用呢?
我们一步一步来看一下,首先建一个空模块,创建一个父类:
class A(osv.Model):
_name="test_a" def M(self,cr,uid,ids,context=None):
print 'M Running'
然后我们创建一个子类B:
class B(osv.Model):
_inherit='A' def M(self,cr,uid,ids,context=None):
print 'MB Running'
此时我们运行模块,输出如下:

可见,子类覆盖了父类的M方法,这跟我们之前的经验是相符的.
继续创建第三个类C:
class C(osv.Model):
_name='A' def M(self,cr,uid,ids,context=None):
print 'MC Running'
如果我们此时运行,那么应该输出的是'MC Running',因为python再初始化该类文件的时候覆盖掉了B类的方法.
如果我们在B类中调用父类方法M,C类中也调用父类方法,会出现什么情况呢?因为B类方法已经被C类方法覆盖掉了,所以预测输出结果是'MC Running. M Running'
class B(osv.Model):
_inherit='A' def M(self,cr,uid,ids,context=None):
super(B,self).M(cr,uid,ids,context=context)
print 'MB Running'
class C(osv.Model):
_name='A' def M(self,cr,uid,ids,context=None):
super(C,self).M(cr,uid,ids,context=context)
print 'MC Running'
结果:

B的方法也运行了!这说明C类是B的子类,调用C的父类方法时调用了B的方法!说明同一个类的继承是叠加的.
那么我们如何不让B类运行,而让C类直接调用A的类方法呢?
答案是:在C的内部调用B的方法:
super(B,self).M(cr,uid,ids,context)
Odoo(OpenERP) 多个子类重载同一个父类方法的执行顺序及如何调用父类的父类方法的更多相关文章
- Java子类和父类的初始化执行顺序
要明白子类和父类的初始化执行顺序,只需要知晓以下三点,就不会再弄错了. 1.创建子类对象时,子类和父类的静态块和构造方法的执行顺序为:父类静态块->子类静态块->父类构造器->子类构 ...
- odoo开发笔记 -- 多个子类继承同一个父类方法的执行顺序
场景描述: odoo模块化开发的架构理念,科学&高效, 可以让很多业务场景,尽可能松耦合:让开发人员的主要精力,关注在当前的业务逻辑: 所谓「前人栽树,后人乘凉」,模块整体好比一棵大树, 开发 ...
- Java中子类和父类相关方法的执行顺序
无意中看到下面一个题目,大家一起来看看最后的输出结果是什么.反正我看完之后,用IDE测试后感觉知识点得到巩固了. /** * 函数执行顺序测试 * Created by 萌小Q on 2017/5/1 ...
- android学习12——重载SurfaceView一些方法的执行顺序
先看代码 public class SurfaceViewActivity extends Activity { @Override public void onCreate(Bundle saved ...
- java中子类继承父类程序执行顺序问题
Java中,new一个类的对象,类里面的静态代码块.非静态代码.无参构造方法.有参构造方法.类的一般方法等部分,它们的执行顺序相对来说比较简单,用程序也很容易验证.比如新建一个测试父类. public ...
- java中子类继承父类程序执行顺序
java中子类继承父类程序执行顺序 FatherTest.java public class FatherTest { private String name; public FatherTest() ...
- 子类重载父类的方法“parent::方法名”转于 恩聪PHP学习教程
在PHP中不能定义重名的函数,也包括不能再同一个类中定义重名的方法,所以也就没有方法重载.单在子类中可以定义和父类重名的方法,因为父类的方法已经在子类中存在,这样在子类中就可以把从父类中继承过来的方法 ...
- 子类重载父类的方法“parent:方法名”
在PHP中不能定义重名的函数,也包括不能再同一个类中定义重名的方法,所以也就没有方法重载.单在子类中可以定义和父类重名的方法,因为父类的方法已经在子类中存在,这样在子类中就可以把从父类中继承过来的方法 ...
- Java基础-父类-子类执行顺序
代码解析 子类 package com; /** * 子类 * @author huage * */ public class Test extends Test1{ public static vo ...
随机推荐
- 【leetcode】Subsets
Subsets Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset ...
- 如何判断CPU字节序之[Big-endian vs Little-endian]
[本文链接] http://www.cnblogs.com/hellogiser/p/big-endian-vs-little-endian.html [Big-endian vs Little-en ...
- codeigniter load_class
2014年7月7日 14:33:36 函数定义在 system/core/common.php中 使用方法是 load_class('Hooks', 'core'): 在core目录内寻找Hooks类 ...
- Sass 中的 @ 规则
一. @import Sass 扩展了 CSS 的 @import 规则,让它能够引入 SCSS 和 Sass 文件. 所有引入的 SCSS 和 Sass 文件都会被合并并输出一个单一的 CSS 文件 ...
- java获取本机IP地址
转载自:http://blog.csdn.net/thunder09/article/details/5360251 在网上找了几个用java获取本机IP地址的代码,发现都少都有些不完美,自己整理了一 ...
- ORACLE查询某一字段重复的数据
第一种方法: select a.* from ASSET_MAINTAIN a inner join ASSET_MAINTAIN b on a.asset_id=b.asset_id and a. ...
- 【USACO】checker
一看题目 经典的8皇后问题 不过是皇后数量可变而已 不用想 回溯法. 需要个生成每次可选择序列的函数, 在存储可选择的序列时按照先大后小的顺序排的.这样每次找最小和去掉最小都很方便,只要有个记录数量的 ...
- 使用Memory Analyzer tool(MAT)分析内存泄漏(一)
转载自:http://www.blogjava.net/rosen/archive/2010/05/21/321575.html 前言 在平时工作过程中,有时会遇到OutOfMemoryError,我 ...
- Ant基本使用指南
近期碰到了其他人在讨论这个ant,已经很多人在使用,故对他进行收集资料进了解,以便方便去使用.同时,在学习struts+spring+hibernate,尤其是Appfuse的过程中大量涉及到ant的 ...
- grep -n 显示行号
[root@86 ~]# grep -n "StartDiscoverers" /usr/local/zabbix/etc/zabbix_server.conf 176:### O ...