Python - 对多继承以及super的一些了解
Python支持多继承,与C++一样都会出现一种问题:子类继承的多个父类又继承了同一个父类,这时就有可能会出现父类构造方法被调用多次的情况。关于这个问题,我找了一些资料,虽然没有亲自全部验证,这里我总结一下自己对这个问题的看法。
Python和C++的关于这个问题的解决方案不太一样,当然Python还要看它的版本。
C++用的方案是引入了虚继承的语法避免同一个类被构造了多次。
Python用的方法是MRO(method resolution order,方法解析顺序) 。在在Python2.3之前,MRO的实现是基于DFS的,而在Python2.3以后MRO的实现是基于C3算法。找到的资料解释了一下更换算法的原因:
# -*- coding:utf-8 -*- class D(object):
def foo(self):
print "class D" class B(D):
pass class C(D):
def foo(self):
print "class C" class A(B, C):
pass f = A()
f.foo()
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
如果我用的是super来解决多继承的初始化问题的话,那么到底是怎么初始化的呢?
这是我一开始想到的一个问题:
class A(object):
def __init__(self,a):
print a class B(object):
def __init__(self,a,b):
print a+b class C(A,B):
def __init__(self):
super(C,self).__init__(?) obj = C()
第十一行的那个'?'的位置到底是填是什么进去才对呢?
我一开始认为因为是多继承多以需要初始化父类的时候A,B都需要初始化,那么问题来了,super(C,self).__init__(?)怎么写?
我试了一下:
① ? = 1 --> 输出1
② ? = 1,2 --> TypeError: __init__() takes exactly 2 arguments (3 given)
定义C的时候改成class(B,A)
③ ? = 1 --> TypeError: __init__() takes exactly 3 arguments (2 given)
④ ? =1,2 --> 输出3
再来看另一段代码:
class A(object):
def func(self):
print 1 class B(object):
def __init__(self):
print 2 class C(A,B):
def __init__(self):
super(C,self).__init__() obj = C()
#The output is 3
说明什么问题?在调用super(classname,self).__init__()的时候应该调用在继承的父类列表里面有实现__init__()这个方法而且最靠左边的那个父类的构造方法,而且这个__init__(?)的'?'一定要与父类列表的里面第一个有构造方法的父类的构造方法签名一样才可以。
所以如果需要对所有父类都进行一遍初始化,还是使用类通过类名调用未绑定的初始化方法好(我说这一句话是因为我还不是很了解super)。
说一下super的使用:
super( classname,对象(一般情况是self) ) 返回的是一个super对象,你可以把它当作父类列表里面有实现__init__()这个方法而且最靠左边的那个父类的一个对象就可以了。
参考文章地址:
最新文章
- win7下IIS的安装和配置 图文教程
- 新手mysql 基础语法
- CentOS下查看进程和删除进程
- VS编译器优化诱发一个的Bug
- BZOJ4719 [Noip2016]天天爱跑步
- Redis安装及主从配置(转)
- Linux C 创建目录函数mkdir相关(转-清新居士)
- 20145225《Java程序设计》 第9周学习总结
- hdu1358 KMP
- Serializable 剔除某些不想保存的字段 transient
- [译]C++书籍终极推荐
- [转] 使用memc-nginx和srcache-nginx模块构建高效透明的缓存机制
- webAPP前端必备知识
- Maven 版 JPA 最佳实践
- Automake创建项目
- Java 螺纹第三版 第三章数据同步 读书笔记
- httpcomponents-client-4.3.x DOC
- Windows显示不了磁盘
- MySql Table错误:is marked as crashed and last (automatic?) 和 Error: Table ";mysql";.";innodb_table_stats"; not found
- AspectCore动态代理中的拦截器详解(一)
热门文章
- ATX 学习 (三)-atxserver2-android-provider
- less新手入门(一) 变量、extend扩展
- http2及server push
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 Minimum Distance in a Star Graph
- 模拟 HDOJ 5387 Clock
- Spring Boot (33) 分布式锁
- Spring.Net学习笔记(八)-设置配置文件参数
- 待销售分拣单App数据推送
- 引入css的四种方式
- Python数据科学安装Numby,pandas,scipy,matpotlib等(IPython安装pandas)