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

 

by:授客 QQ1033553122

 

测试环境:

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

>>>

Python 在子类中调用父类方法详解(单继承、多层继承、多重继承)的更多相关文章

  1. python基础----继承与派生、组合、接口与归一化设计、抽象类、子类中调用父类方法

    一.什么是继承                                                                          继承是一种创建新的类的方式,在pyth ...

  2. python基础之类的继承与派生、组合、接口与归一化设计、抽象类、子类中调用父类方法

    一.什么是继承 继承是一种创建新的类的方式,新建的类可以继承自一个或者多个父类,原始类称为基类或超类,新建的类称为派生类或子类. 派生:子类继承了父类的属性,然后衍生出自己新的属性,如果子类衍生出的新 ...

  3. c++虚函数、子类中调用父类方法

    全部 代码: 1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 #include< ...

  4. 在子类中调用父类的方法super

    1.没有super之前,在子类里面需要父类里面的逻辑,但是我们是通过派生(自己定义了一个init,增加了一条line) class vehichle:#定义一个交通工具的类 Country=" ...

  5. Python中格式化format()方法详解

    Python中格式化format()方法详解 Python中格式化输出字符串使用format()函数, 字符串即类, 可以使用方法; Python是完全面向对象的语言, 任何东西都是对象; 字符串的参 ...

  6. C++调用JAVA方法详解

    C++调用JAVA方法详解          博客分类: 本文主要参考http://tech.ccidnet.com/art/1081/20050413/237901_1.html 上的文章. C++ ...

  7. Java中的main()方法详解

    在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是 ...

  8. (转)shell中test命令方法详解

    test命令用法.功能:检查文件和比较值 shell中test命令方法详解 原文:https://www.cnblogs.com/guanyf/p/7553940.html 1)判断表达式 if te ...

  9. 关于 redux-saga 中 take 使用方法详解

    本文介绍了关于redux-saga中take使用方法详解,分享给大家,具体如下: 带来一个自己研究好久的API使用方法. redux-saga中effect中take这个API使用方式,用的多的是ca ...

随机推荐

  1. 课程二(Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization),第三周(Hyperparameter tuning, Batch Normalization and Programming Frameworks) —— 2.Programming assignments

    Tensorflow Welcome to the Tensorflow Tutorial! In this notebook you will learn all the basics of Ten ...

  2. Numpy 常用矩阵计算函数

    基本属性 在做一些数据分析的时候,我们通常会把数据存为矩阵的形式,然后python本身对于矩阵的操作是不够的,因此出现了numpy这样一个科学开发库来进行python在次上面的不足. Numpy's ...

  3. 自动化部署-从maven到shell脚本到jenkins

    Java代码自动部署 [ ①Java代码自动部署-总结简介] 代码部署是每一个软件开发项目组都会有的一个流程,也是从开发环节到发布功能必不可少的环节.对于Java开发者来说,Java代码的发布部署也是 ...

  4. Mac OS X 下搭建thrift环境

    1.概述 thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生产引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, ...

  5. POJ2418 Hardwood Species—二叉查找树应用

    1. Hardwood Species原题描述   Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 14326   Acce ...

  6. windows环境下搭建Java开发环境(三)——Maven环境配置使用 (转)

    1. 安装配置Maven: 1.1 从Apache网站 http://maven.apache.org/ 下载并且解压缩安装Apache Maven. Maven下载地址: http://maven. ...

  7. SpringMvc @RequestParam 使用推荐使用包装类型代替包装类型

    SpringMvc 中@RequestParam注解使用 建议使用包装类型来代替基本数据类型 public String form2(@RequestParam(name="age" ...

  8. 基于opencv将视频转化为字符串Java版

    基于opencv将视频转化为字符串Java版 opencv java  先上一个效果图吧 首先,弄清一下原理 我们要将视频转化为字符画,那么就需要获取画面的每一帧,也就是每一张图片,然后将图片进行转化 ...

  9. VS2012 编译报错:找不到编译动态表达式所需的一个或多个类型。是否缺少引用?

    今天编译公司项目,原本项目是3.5,由于现在要用到dynamic ,把target 改为4.0 ,编译时 报错误  “找不到编译动态表达式所需的一个或多个类型.是否缺少引用?”,然后根据另一个提示排错 ...

  10. [转]Magento 2中文文档教程 - 配置和运行cron(定时任务)

    本文转自:https://blog.csdn.net/xz_src/article/details/72793476 cron(定时任务)概述 Magento 2 有许多功能需要用到cron(定时任务 ...