python 有关super
2015-08-29 17:22
501 查看
# coding=utf-8_ _author__ = "leaves" print '--------------1------------------' class Base1(object): # 这里必须有object否则子类调用super会报错,因为Python 2中的classobj不算做一种type,Python 3的话应该就没有这种问题 def __init__(self): print 'Enter Base1 init' print 'Enter Base1 init' class Child1(Base1): def __init__(self): print "Enter Child1 init" Base1.__init__(self) print "Exit Child1 init" child = Child1() print '--------------2------------------' class Base2(object): def __init__(self): print 'Enter Base2 init' print 'Enter Base2 init' class Child2(Base2): def __init__(self): print "Enter Child2 init" super(Child2, self).__init__() print "Exit Child2 init" child = Child2() print '--------------3------------------' # Base2继承自Base1,这样就两个init都可以执行了 class Child3(Base2, Base1): def __init__(self): print "Enter Child3 init" # 这里super只执行了Base2的init,两个父类有相同的方法名或变量名时,无法确定应继承哪一个,,Python会自动按顺序选择拥有所需方法名的第一个父类并执行,而忽略其他父类中的同名方法 super(Child3, self).__init__() print "Exit Child3 init" child = Child3() print '--------------4------------------' # Base2继承自Base1,这样就两个init都可以执行了 class Base3(Base1): def __init__(self): print 'Enter Base3 init' super(Base3, self).__init__() print 'Enter Base3 init' class Child4(Base3): def __init__(self): print "Enter Child3 init" # 这里super只执行了Base2的init,两个父类有相同的方法名或变量名时,无法确定应继承哪一个,,Python会自动按顺序选择拥有所需方法名的第一个父类并执行,而忽略其他父类中的同名方法 super(Child4, self).__init__() print "Exit Child3 init" child = Child4() print '--------------5------------------' class Base4(object): def __init__(self): print 'Enter Base4 init' print 'Enter Base4 init' class Child5(Base4): def __init__(self): print 'Enter Child5 init' Base4.__init__(self) print 'Enter Child5 init' class Child6(Base4): def __init__(self): print 'Enter Child6 init' Base4.__init__(self) print 'Enter Child6 init' class Child7(Child5, Child6): def __init__(self): print 'Enter Child7 init' Child5.__init__(self) Child6.__init__(self) print 'Enter Child7 init' child = Child7() print '--------------6------------------' class Base5(object): def __init__(self): print 'Enter Base4 init' print 'Enter Base4 init' class Child8(Base5): def __init__(self): print 'Enter Child5 init' super(Child8, self).__init__() print 'Enter Child5 init' class Child9(Base4): def __init__(self): print 'Enter Child6 init' super(Child9, self).__init__() print 'Enter Child6 init' class Child10(Child5, Child6): def __init__(self): print 'Enter Child7 init' super(Child10, self).__init__() print 'Enter Child7 init' child = Child10()
outPut:
--------------1------------------ Enter Child1 init Enter Base1 init Enter Base1 init Exit Child1 init --------------2------------------ Enter Child2 init Enter Base2 init Enter Base2 init Exit Child2 init --------------3------------------ Enter Child3 init Enter Base2 init Enter Base2 init Exit Child3 init --------------4------------------ Enter Child3 init Enter Base3 init Enter Base1 init Enter Base1 init Enter Base3 init Exit Child3 init --------------5------------------<<span style="color:#ff0000;">基类Base4执行了两次></span> Enter Child7 init Enter Child5 init Enter Base4 init Enter Base4 init Enter Child5 init Enter Child6 init Enter Base4 init Enter Base4 init Enter Child6 init Enter Child7 init --------------6------------------ Enter Child7 init Enter Child5 init Enter Base4 init Enter Base4 init Enter Child5 init Enter Child7 init
相关文章推荐
- Python爬虫框架Scrapy教程(1)—入门
- Python - 带参数的方法
- Python爬虫框架Scrapy教程(1)—入门
- 2015/8/28 Python基础(2):对象
- 2015/8/26 Python基础(1):基本规则及赋值
- python - os模块中比较有用的部分
- Python使用os.listdir()函数来得目录内容的介绍
- python大法好!
- Python 守护进程 例子
- python zerorpc分布式框架
- python中range函数的使用
- 学习日志---python(列表解析、生成器、字典和集合)
- python学习资源
- python各进制相互转换
- Python包管理工具——Pip
- Python--递归函数
- python中使用Element操作xml
- python 异步I/O
- Python单元测试框架之pytest -- fixtures
- 将图片生成pkl格式的文件(多层循环)