python的super缺陷,需要特别注意
来源:互联网 发布:无杠杆beta的算法 编辑:程序博客网 时间:2024/05/01 10:45
首先,运行如下代码:
class D(object): def foo(self): print "class D" class B(object): def foo(self): print "class B" super(B,self).foo() class C(D): def foo(self): print "class C" super(C,self).foo() class A(B,C): print "class A" pass f = A()f.foo()
程序输出:
class Aclass Bclass Cclass D
修改程序class B:
class B(object): def foo(self): print "class B" super(C,self).foo()
将super的第一个参数修改为C,运行程序,输出结果为:
class Aclass Bclass D
出现这个问题的原因在于python的MRO机制了:
python调用一个类的方法的时候,是根据MRO原则来查找的。具体的原则为从左到右,广度优先。在python2.2之前为深度优先。
所以,class A的调用顺序为:
print 'MRO:',[x.__name__ for x in A.__mro__]#MRO: ['A', 'B', 'C', 'D', 'object']
我们在使用super方法的时候,f其实一直都是A,也就是说self一直是A,那么函数的调用顺序就没有变过。
根据super的第一个参数,我们就可以找到接下来要执行的是哪个类的方法了。
ok!
- python的super缺陷,需要特别注意
- Python安装中需要特别注意的一件事
- 线程中需要特别注意的volatile
- matplotlib安装(特别需要注意的地方)
- Python几点要特别注意!
- 生活中特别需要注意的一些小案例
- WEB 安全方面需要特别注意的问题
- 支付宝接口需要特别注意的几点问题
- Symbian系统上C工程师需要特别注意的地方
- 文件输入输出流中需要特别注意的一点
- mysql数据库你需要特别注意的23个事项
- iOS开发需要特别注意的问题总结
- 安卓手机安全--目前需要特别注意的问题
- tuple(元组)中特别需要注意的两点
- stl map 插入方式和特别需要注意的区别
- JPA性能调优会需要特别注意的2点
- java多态继承中需要特别注意的点
- mdk软件仿真需要注意的特别设置
- C++程序面试笔迹四
- 最长上升子序列 (dp)
- ssh框架中事务管理配置
- Hadoop的现在和未来
- 用RAR做自解压exe文件的方法
- python的super缺陷,需要特别注意
- 同步/异步与阻塞/非阻塞的区别
- tomcat6.x 发布Javaweb应用
- NoSQL的现状
- Spring声明式事务配置管理方法
- 学习JBPM-第一篇
- [译]14种参与开源项目的方法,不需要你成为一名编程天才或者摇滚明星
- 如何用RAR制作安装程序
- 为什么java中Byte类型的取值范围是-128~127