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决定了前往哪个父类调用指定的方法

 

目录
相关文章
|
27天前
|
调度 Python
微电网两阶段鲁棒优化经济调度方法(Python代码实现)
微电网两阶段鲁棒优化经济调度方法(Python代码实现)
|
1月前
|
Python
Python字符串center()方法详解 - 实现字符串居中对齐的完整指南
Python的`center()`方法用于将字符串居中,并通过指定宽度和填充字符美化输出格式,常用于文本对齐、标题及表格设计。
|
2月前
|
安全 Python
Python语言中常用的文件操作方法探讨
通过上述方法的结合使用,我们可以构筑出强大并且可靠的文件操作逻辑,切实解决日常编程中遇到的文件处理问题。
157 72
|
26天前
|
机器学习/深度学习 数据采集 算法
【CNN-BiLSTM-attention】基于高斯混合模型聚类的风电场短期功率预测方法(Python&matlab代码实现)
【CNN-BiLSTM-attention】基于高斯混合模型聚类的风电场短期功率预测方法(Python&matlab代码实现)
|
2月前
|
数据管理 开发工具 索引
在Python中借助Everything工具实现高效文件搜索的方法
使用上述方法,你就能在Python中利用Everything的强大搜索能力实现快速的文件搜索,这对于需要在大量文件中进行快速查找的场景尤其有用。此外,利用Python脚本可以灵活地将这一功能集成到更复杂的应用程序中,增强了自动化处理和数据管理的能力。
154 0
多重继承 | Python从入门到精通:高阶篇之三十二
在Python中是支持多重继承的,也就是我们可以为一个类同时指定多个父类。这是与别的大部分语言不一致的。但在开发中没有特殊的情况,应该尽量避免使用多重继承,因为多重继承会让我们的代码过于复杂。
多重继承 | Python从入门到精通:高阶篇之三十二
|
6月前
|
机器学习/深度学习 存储 设计模式
Python 高级编程与实战:深入理解性能优化与调试技巧
本文深入探讨了Python的性能优化与调试技巧,涵盖profiling、caching、Cython等优化工具,以及pdb、logging、assert等调试方法。通过实战项目,如优化斐波那契数列计算和调试Web应用,帮助读者掌握这些技术,提升编程效率。附有进一步学习资源,助力读者深入学习。
|
3月前
|
Python
Python编程基石:整型、浮点、字符串与布尔值完全解读
本文介绍了Python中的四种基本数据类型:整型(int)、浮点型(float)、字符串(str)和布尔型(bool)。整型表示无大小限制的整数,支持各类运算;浮点型遵循IEEE 754标准,需注意精度问题;字符串是不可变序列,支持多种操作与方法;布尔型仅有True和False两个值,可与其他类型转换。掌握这些类型及其转换规则是Python编程的基础。
211 33
|
2月前
|
数据采集 分布式计算 大数据
不会Python,还敢说搞大数据?一文带你入门大数据编程的“硬核”真相
不会Python,还敢说搞大数据?一文带你入门大数据编程的“硬核”真相
85 1
|
3月前
|
设计模式 安全 Python
Python编程精进:正则表达式
正则表达式是一种强大的文本处理工具,用于搜索、匹配和提取模式。本文介绍了正则表达式的语法基础,如`\d`、`\w`等符号,并通过实例展示其在匹配电子邮件、验证电话号码、处理日期格式等场景中的应用。同时,文章提醒用户注意性能、编码、安全性等问题,避免常见错误,如特殊字符转义不当、量词使用错误等。掌握正则表达式能显著提升文本处理效率,但需结合实际需求谨慎设计模式。
135 2

热门文章

最新文章

推荐镜像

更多