Python 在子类中调用父类方法详解(单继承、多层继承、多重继承)

简介: Python 在子类中调用父类方法详解(单继承、多层继承、多重继承)

Python在子类中调用父类方法详解(单继承、多层继承、多重继承)

 


 

 

测试环境:

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

说明:

1super(type, obj),其中obj必须是type类型、type子类类型的实例,否则会报错:

TypeError: super(type, obj): obj must be an instance or subtype of type

 

2super().__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-12-2,可看出super(type[,type2_or_obj]),type决定了super调用方法所在的父类--type的父类(如果有的话),即type决定了前往哪个父类调用指定的方法

 

目录
相关文章
|
2月前
|
测试技术 开发者 Python
Python单元测试入门:3个核心断言方法,帮你快速定位代码bug
本文介绍Python单元测试基础,详解`unittest`框架中的三大核心断言方法:`assertEqual`验证值相等,`assertTrue`和`assertFalse`判断条件真假。通过实例演示其用法,帮助开发者自动化检测代码逻辑,提升测试效率与可靠性。
284 1
|
3月前
|
机器学习/深度学习 数据采集 数据挖掘
基于 GARCH -LSTM 模型的混合方法进行时间序列预测研究(Python代码实现)
基于 GARCH -LSTM 模型的混合方法进行时间序列预测研究(Python代码实现)
115 2
|
2月前
|
人工智能 数据安全/隐私保护 异构计算
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
358 8
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
|
2月前
|
算法 调度 决策智能
【两阶段鲁棒优化】利用列-约束生成方法求解两阶段鲁棒优化问题(Python代码实现)
【两阶段鲁棒优化】利用列-约束生成方法求解两阶段鲁棒优化问题(Python代码实现)
|
3月前
|
机器学习/深度学习 数据采集 TensorFlow
基于CNN-GRU-Attention混合神经网络的负荷预测方法(Python代码实现)
基于CNN-GRU-Attention混合神经网络的负荷预测方法(Python代码实现)
131 0
|
2月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
261 102
|
2月前
|
数据采集 机器学习/深度学习 算法框架/工具
Python:现代编程的瑞士军刀
Python:现代编程的瑞士军刀
295 104
|
2月前
|
人工智能 自然语言处理 算法框架/工具
Python:现代编程的首选语言
Python:现代编程的首选语言
247 103
|
2月前
|
机器学习/深度学习 人工智能 数据挖掘
Python:现代编程的首选语言
Python:现代编程的首选语言
186 82

推荐镜像

更多