多继承
2015-09-19 09:31
232 查看
python中支持多继承。当用派生类对象调用函数时,如果派生类有定义该函数,那么它就覆盖基类中的函数
如果想调用到基类被覆盖的函数,那么应该通过显示调用
super()是访问到基类的关键,那么如何理解super()?
super是沿着最初始调用类的MRO链执行调用的。也就是说,super()第一次调用,是取到MRO链中第一个元素;第二次调用,第二个
由上可知,在Z中调用super(),得到是X;然后在X中super(),得到是Y;在Y中调用super(),得到是object
需要注意的是:这种多继承MRO链式调用,适用于调用函数的参数形式一致(或者没有参数,如close、get类函数)的情况。
参考: http://www.artima.com/weblogs/viewpost.jsp?thread=281127
class X(object): def __init__(self): print('X') class Z(X): def __init__(self): print("Z") >> z = Z() # 派生类__init__覆盖了基类的__init__ >> Z
如果想调用到基类被覆盖的函数,那么应该通过显示调用
class X(object): def __init__(self): print('X') class Z(X): def __init__(self): super().__init__() # 对于python 2.x,super(Z, self).__init__() print("Z") >> z = Z() >> X Z
super()是访问到基类的关键,那么如何理解super()?
super是沿着最初始调用类的MRO链执行调用的。也就是说,super()第一次调用,是取到MRO链中第一个元素;第二次调用,第二个
class X(object): def __init__(self, a): print('--X') super().__init__(2) print('X--') def hello(self, a): pass class Y(object): def __init__(self, a): print('--Y') super().__init__() print('Y--') class Z(X, Y): def __init__(self, a): print('--Z') super().__init__(a) print('Z--') print(Z.__mro__) z = Z(1) >> (<class '__main__.Z'>, <class '__main__.X'>, <class '__main__.Y'>,<class 'object'>) >> --Z >> --X >> --Y >> Y-- >> X-- >> Z--
由上可知,在Z中调用super(),得到是X;然后在X中super(),得到是Y;在Y中调用super(),得到是object
需要注意的是:这种多继承MRO链式调用,适用于调用函数的参数形式一致(或者没有参数,如close、get类函数)的情况。
参考: http://www.artima.com/weblogs/viewpost.jsp?thread=281127
相关文章推荐
- 洛谷1147 连续自然数和
- cocos2d-x-3.8.1 Mac环境配置
- 关于财易酒店管理系统折扣问题详解
- Neo4j集群环境建设
- iOS UIGestureRecognizer手势总结
- ios9 应用传输安全:ATS
- eclipes更改配色的插件,炫酷高大上
- [LeetCode#174] Dungeon Game
- JS实现仿雅虎首页快捷登录入口及导航模块效果
- 目标+问题积累包
- JSONP跨域的原理解析
- CentOS mount: unknown filesystem type 'ntfs'
- 虚拟IP原理
- 关于type=file;事件只执行一次的问题
- 3.2.5.10 识别中文的正则表达式
- 什么是道德?
- 【基础练习】【模拟】codevs1053 笨小猴题解
- 【Wordpress】消除Wordpress3.1.x在php5.4.x上的一堆警告
- 3.2.5.10 识别中文的正则表达式
- 【codevs1079】回家 解题报告