Python 在子类中调用父类方法详解(单继承、多层继承、多重继承)
Python 在子类中调用父类方法详解(单继承、多层继承、多重继承)
by:授客 QQ:1033553122
测试环境:
win7 64位
Python版本:Python 3.3.5
代码实践:
1、在子类中通过“类名”调用父类的方法
class FatherA:
def __init__(self):
print('init action in father class A')
class SubClassB(FatherA):
def __init__(self):
print('init action in subclass B')
FatherA.__init__(self) # 在子类中调用父类的方法:父类名.方法名称(参数)
if __name__ == '__main__':
b = SubClassB()
运行结果:
>>> ================================ RESTART ================================
>>>
init action in subclass B
init action in father class A
缺点:当一个子类的父类发生变化时(如类SubClassB的父类由FatherA变为FatherD时),必须遍历整个类定义,把子类中所有的父类类名全部替换过来
2、在子类中通过“super”方法调用父类的方法
场景1、单层继承
class FatherA:
def __init__(self):
print('init action in father class A')
class SubClassB(FatherA):
def __init__(self):
print('init action in father class B')
super().__init__() # 在子类中调用父类的方法:super().方法名称(参数)
if __name__ == '__main__':
b = SubClassB()
class FatherA:
def __init__(self):
print('init action in father class A')
class SubClassB(FatherA):
def __init__(self):
print('init action in subclass B')
super(SubClassB, self).__init__() # 在子类中调用父类的方法:super(type, obj).方法名称(参数)
if __name__ == '__main__':
b = SubClassB()
运行结果:
>>> ================================ RESTART ================================
>>>
init action in father class B
init action in father class A
说明:
1、super(type, obj),其中obj必须是type类型、type子类类型的实例,否则会报错:
TypeError: super(type, obj): obj must be an instance or subtype of type
2、super().__init__() 效果等同 super(SubClassB, self). __init__()
场景2、多层继承
实验1:
class FatherA:
def __init__(self):
print('init action in father class A')
class SubClassB(FatherA):
def __init__(self):
print('init action in subclass B')
super().__init__()
class SubClassC(SubClassB):
def __init__(self):
print('init action in subclass C')
super().__init__()
if __name__ == '__main__':
b = SubClassC()
运行结果:
>>> ================================ RESTART ================================
>>>
init action in subclass C
init action in subclass B
init action in father class A
对比实验1-1:
class FatherA:
def __init__(self):
print('init action in father class A')
class SubClassB(FatherA):
def __init__(self):
print('init action in subclass B')
super().__init__()
class SubClassC(SubClassB):
def __init__(self):
print('init action in subclass C')
super(SubClassB, self).__init__()
if __name__ == '__main__':
b = SubClassC()
运行结果:
>>> ================================ RESTART ================================
>>>
init action in subclass C
init action in father class A
>>>
对比实验1-2:
class FatherA:
def __init__(self):
print('init action in father class A')
class SubClassB(FatherA):
def __init__(self):
print('init action in subclass B')
super().__init__()
class SubClassC(SubClassB):
def __init__(self):
print('init action in subclass C')
super(FatherA, FatherA).__init__(self) # 在子类中调用父类的方法:super(type, type).方法名称(参数)
if __name__ == '__main__':
b = SubClassC()
说明:可把 super(FatherA, FatherA).__init__(self) 换成:
super(FatherA, self).__init__()
或
super(FatherA, SubClassB).__init__(self)
或
super(FatherA, SubClassC).__init__(self)
注意:以上这种情况,必须给__init__传递参数self,否则会报错:
TypeError: __init__() missing 1 required positional argument: 'self'
运行结果:
>>> ================================ RESTART ================================
>>>
init action in subclass C
>>>
说明:super(type1, type2) ,type2必须和type1相同类型,或者其子类类型
实验2:
class FatherA:
def __init__(self):
print('init action in father class A')
class SubClassB(FatherA):
def __init__(self):
print('init action in subclass B')
super().__init__()
class SubClassC(SubClassB):
def __init__(self):
print('init action in subclass C')
super().__init__()
class SubClassD(SubClassC):
def __init__(self):
print('init action in subclass D')
super().__init__()
if __name__ == '__main__':
b = SubClassD()
运行结果:
>>> ================================ RESTART ================================
>>>
init action in subclass D
init action in subclass C
init action in subclass B
init action in father class A
对比实验2-1:
class FatherA:
def __init__(self):
print('init action in father class A')
class SubClassB(FatherA):
def __init__(self):
print('init action in subclass B')
super().__init__()
class SubClassC(SubClassB):
def __init__(self):
print('init action in subclass C')
super().__init__()
class SubClassD(SubClassC):
def __init__(self):
print('init action in subclass D')
super(SubClassB, self).__init__()
if __name__ == '__main__':
b = SubClassD()
运行结果:
>>> ================================ RESTART ================================
>>>
init action in subclass D
init action in father class A
>>>
对比实验2-2:
class FatherA:
def __init__(self):
print('init action in father class A')
class SubClassB(FatherA):
def __init__(self):
print('init action in subclass B')
super().__init__()
class SubClassC(SubClassB):
def __init__(self):
print('init action in subclass C')
super().__init__()
class SubClassD(SubClassC):
def __init__(self):
print('init action in subclass D')
super(SubClassC, self).__init__()
if __name__ == '__main__':
b = SubClassD()
运行结果:
>>> ================================ RESTART ================================
>>>
init action in subclass D
init action in subclass B
init action in father class A
通过对比实验2-1, 2-2,可看出super(type[,type2_or_obj]),type决定了super调用方法所在的父类--type的父类(如果有的话),即type决定了前往哪个父类调用指定的方法
场景3、多重继承
实验1:
class FatherA:
def __init__(self):
print('init action in father class A')
class FatherB:
def __init__(self):
print('init action in father class B')
class SubClassC(FatherA, FatherB):
def __init__(self):
print('init action in subclass C')
super(FatherB).__init__()
if __name__ == '__main__':
b = SubClassC()
运行结果:
>>> ================================ RESTART ================================
>>>
init action in subclass C
对比实验1-1:
class FatherA:
def __init__(self):
print('init action in father class A')
class FatherB:
def __init__(self):
print('init action in father class B')
class SubClassC(FatherB, FatherA):
def __init__(self):
print('init action in subclass C')
super().__init__()
if __name__ == '__main__':
b = SubClassC()
运行结果:
>>> ================================ RESTART
================================
>>>
init action in subclass C
init action in father class B
>>>
对比实验1-2:
class FatherA:
def __init__(self):
print('init action in father class A')
class FatherB:
def __init__(self):
print('init action in father class B')
class SubClassC(FatherA, FatherB):
def __init__(self):
print('init action in subclass C')
super().__init__()
if __name__ == '__main__':
b = SubClassC()
运行结果:
>>> ================================ RESTART
================================
>>>
init action in subclass C
init action in father class A
>>>
对比实验1-3:
class FatherA:
def __init__(self):
print('init action in father class A')
class FatherB:
def __init__(self):
print('init action in father class B')
class SubClassC(FatherA, FatherB):
def __init__(self):
print('init action in subclass C')
super(FatherB).__init__()
if __name__ == '__main__':
b = SubClassC()
>>> ================================ RESTART
================================
>>>
init action in subclass C
对比实验1-4:
class FatherA:
def __init__(self):
print('init action in father class A')
def testfn(self, arg):
print('testfn in father class A')
class FatherB:
def __init__(self):
print('init action in father class B')
def testfn(self):
print('testfn in father class B')
class SubClassC(FatherA, FatherB):
def __init__(self):
print('init action in subclass C')
super().testfn()
if __name__ == '__main__':
b = SubClassC()
运行结果:
>>> ================================ RESTART
================================
>>>
init action in subclass C
Traceback (most recent call last):
File
"C:/Users/Administrator/Desktop/1.py", line 21, in
b = SubClassC()
File
"C:/Users/Administrator/Desktop/1.py", line 18, in
__init__
super().testfn()
TypeError: testfn() missing 1 required positional
argument: 'arg'
>>>
对比实验1-5:
class FatherA:
def __init__(self):
print('init action in father class A')
def testfn(self):
print('testfn in father class A')
class FatherB:
def __init__(self):
print('init action in father class B')
def testfn(self, arg):
print('testfn in father class B')
class SubClassC(FatherA, FatherB):
def __init__(self):
print('init action in subclass C')
super().testfn()
if __name__ == '__main__':
b = SubClassC()
运行结果:
>>> ================================ RESTART
================================
>>>
init action in subclass C
testfn in father class A
说明:通过对比实验1-1,1-2,1-3,1-4,1-5可以看出,子类水平方向上,继承多个父类,以super().method(参数)方法调用父类的方法,如果不同父类中存在同名方法method(不管参数列表是否相同),则按继承顺序,选择第一个父类中的方法。,如果想要调用多个方法咋办?如下,通过类名调用
class FatherA:
def __init__(self):
print('init action in father class A')
class FatherB:
def __init__(self):
print('init
action in father class B')
class SubClassC(FatherA, FatherB):
def __init__(self):
print('init action in subclass C')
FatherA.__init__(self)
FatherB.__init__(self)
if __name__ == '__main__':
b = SubClassC()
>>> ================================ RESTART
================================
>>>
init action in subclass C
init action in father class A
init action in father class B
>>>
最新文章
- WindowsFormsIntegration.dll
- 14SpringMvc_在业务控制方法中写入HttpServletRequest,HttpServletResponse等传统web参数(这个知识点知道就好了,不推荐这么去做)
- SQL远程创建数据库
- highcharts 去掉右下角链接
- 关于cvAdsDiffS的那些事
- 【iOS】swift 保持代码优美的10个方法
- GNS3 1.4.0b3 MSTP多生成树配置实验
- Echo团队Alpha冲刺随笔 - 第五天
- CentOS7中使用yum安装Nginx的方法
- Saltstack 分发
- 洛谷p1732 活蹦乱跳的香穗子 二维DP
- GPUImage API文档之GPUImageInput协议
- Android跑指定包Monkey脚本
- APMServ—优秀的PHP集成环境工具
- 「Python」字符串操作内置函数
- 开发环境eclipse for Mac 下的常用快捷键汇总(基本参照Win系,将Ctrl换为Command)
- 【BZOJ】1012: [JSOI2008]最大数maxnumber /【洛谷】1198(线段树)
- 如何防止Unity3D代码被反编译?
- python基础===函数的几个要点
- QQ互联登陆的最简洁代码
热门文章
- (转)关于python3中staticmethod(静态方法)classmethod(类方法)实例方法的联系和区别
- Ruby:Mechanize的使用教程
- C# 多线程九之Timer类
- N元马尔科夫链的实现
- #ifdef、#ifndef、#else、#endif执行条件编译
- Andrew Ng机器学习课程笔记(三)之正则化
- MQ5.3在redhat9上的安装
- 自我总结(四) ---java web项目完结,j2ee的开始
- js实现时间日期的格式化
- NYOJ 1013 除法表达式(欧几里德算法+唯一分解定理)