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. 生成代码的代码 之 POJO生成器 之二 模板实现

    在之前的一篇博客中,我们写了利用node.js来生成JAVA的POJO代码的方法.有评论说可以利用模板来做这件事.当时认为模板只能做简单的字符串替换,所以可能无法完成任务.但是,仔细的学习了一个模板 ...

  2. 3DMax——基础

    1.首次打开3DMAX设置单位: 自定义→单位设置→①系统单位设置→1单位=1.0毫米:②公制→毫米 注:室内单位为毫米,室外单位为米 2.从CAD导出可以导入到3DMAX的文件: 选中要导出的部分→ ...

  3. WebForm - 文本框回车事件

    document.getElementById("Pwd").onkeyup = function (e) { ) { fun_Login(); } };

  4. Java 中的队列 Queue

    一.队列的定义 我们都知道队列(Queue)是一种先进先出(FIFO)的数据结构,Java中定义了java.util.Queue接口用来表示队列.Java中的Queue与List.Set属于同一个级别 ...

  5. Shellexecute头文件

    调用ShellExecute所需要头文件 #include   "windows.h " #include   "shellapi.h "

  6. [Java初探08]__简单学习Java类和对象

    前言 在前面的学习中,我们对面向对象的编程思想有了一个基本的了解,并且简单的了解了类和对象的定义.那么类和对象在Java语言中是如何表现的,这次,就从实际出发,学习一下一下类和对象在Java语言中的使 ...

  7. java学习-http中get请求的非ascii参数如何编码解码探讨

    # 背景: 看着别人项目代码看到一个PathUtils工具类, 里面只有一个方法,String  rebuild(String Path),将路径进行URLDecoder.decode解码,避免路径中 ...

  8. j2ee高级开发技术课程第五周

    pplet 是一种 Java 程序.它一般运行在支持 Java 的 Web 浏览器内.因为它有完整的 Java API支持,所以Applet 是一个全功能的 Java 应用程序. 如下所示是独立的 J ...

  9. springboot 多模块 -- 将web拆分出去 - 流动计算架构

    前言: 之前将各层都拆分出去, 作为一个独立的可替换的子模块. 感觉比以前确实是灵活了一些. 不管是电商项目, 还是现在公司做的项目, 其中, 有很多的业务逻辑, 都是一样的, 但是由于不在一个系统中 ...

  10. 通过DataTrigger绑定Tag属性值进行判断(.net 3.5的环境)

    如下,在UserControl中通过Tag传递不同的值,然后在Style中使用DataTrigger进行判断, <UserControl Style="{DynamicResource ...