python的super缺陷,需要特别注意
2013-03-05 22:46
344 查看
首先,运行如下代码:
程序输出:
修改程序class B:
将super的第一个参数修改为C,运行程序,输出结果为:
出现这个问题的原因在于python的MRO机制了:
python调用一个类的方法的时候,是根据MRO原则来查找的。具体的原则为从左到右,广度优先。在python2.2之前为深度优先。
所以,class A的调用顺序为:
我们在使用super方法的时候,f其实一直都是A,也就是说self一直是A,那么函数的调用顺序就没有变过。
根据super的第一个参数,我们就可以找到接下来要执行的是哪个类的方法了。
ok!
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 A class B class C class D
修改程序class B:
class B(object): def foo(self): print "class B" super(C,self).foo()
将super的第一个参数修改为C,运行程序,输出结果为:
class A class B class 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安装中需要特别注意的一件事
- Python安装中需要特别注意的一件事
- 机器学习从Python 2迁移到Python 3,你需要注意的一些事……
- [Python爬虫]爬取东方财富网公司公告需要注意的几个问题
- 安卓手机安全--目前需要特别注意的问题
- [python]不同于Java的需要注意的用法
- [python]decimal常用操作和需要注意的地方
- Python基础 语法特别注意笔记(和Java相比)
- python几点要特别注意! -- 不断更新中
- Java 中this与super需要注意的地方
- python3实现一维数组求最大值返回参数需要注意的地方
- Dotnet跨应用程序域访问和需要特别注意的地方(WCF消息通道处于错误状态异常中的一种情况)
- python中字符串使用需要注意的地方
- 建议64:为循环增加Tester-Doer模式而不是将try-catch置于循环内 如果需要在循环中引发异常,你需要特别注意,应为抛出异常是一个相当影响性能的过程。应该尽量在循环当中对异常发生的一
- Python中的比较运算符,要特别注意的是 == 和 is 的区别
- python min()函数需要注意的一些小点
- iOS开发需要特别注意的问题总结
- python .egg ‘蟒蛇蛋’的制作和需要注意的问题
- Python基础 语法特别注意笔记(和Java相比)