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 ...
随机推荐
- div设置边框黑框显示
style="width:756px; height:68px; border:1px solid #000000;"
- Eclipse 一直提示 loading descriptor for 的解决方法(转)
启动eclipse之后,进行相关操作时,弹出界面,提示:loading descriptor for xxx 解决方法: 在Eclipse左侧的Project Explorer 最右上角有一个小钮,鼠 ...
- 58. 分析、测试与总结:罗马数字和阿拉伯数字的转换[roman to integer and integer to roman in c++]
[本文链接] http://www.cnblogs.com/hellogiser/p/roman-to-integer-and-integer-to-roman.html [题目] 给出一个罗马数字, ...
- kettle转换JavaScript获取命令行参数
日常开发中由于很多参数是变化的,需要在部署时才能确定.而写在配置文件里又显得很笨重,因而可以运行时实时指定.那么kettle是怎么获取命令行中的参数的呢? kettle可以通过转换里的JavaScri ...
- JavaScript关闭窗口的同时打开新页面的方法
做网页的时候需要弹出一个小窗口,然后要实现一个功能就是鼠标点击超链接关闭小窗口并打开一个新页面,就如同下图: 这是一个小窗口,点击超链接这个窗口会关闭并且会正常在浏览器打开新页面,首先写js关闭窗口的 ...
- js如何往数组Array中添加元素
转载自:http://blog.sina.com.cn/s/blog_95fa28e60101mwup.html unshift:将参数添加到原数组开头,并返回数组的长度 pop:删除原数组最后一项 ...
- php的socket通信(二)
案例一:代码详解 // 设置一些基本的变量$host = "192.168.1.99";$port = 1234;// 设置超时时间set_time_limit(0);// 创建一 ...
- border-box
box-sizing属性可以为三个值之一:content-box(default),border-box,padding-box. content-box,border和padding不计算入wi ...
- [MACOS] Mac上的抓包工具Charles
转载自: http://blog.csdn.net/jiangwei0910410003/article/details/41620363 今天就来看一下Mac上如何进行抓包,之前有一篇文章介绍了使用 ...
- python基础——列表生成式
python基础——列表生成式 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 举个例子,要生成list [1, 2, 3, 4 ...