Python3中的super()函数详解
关于Python3中的super()函数
我们都知道,在Python3中子类在继承父类的时候,当子类中的方法与父类中的方法重名时,子类中的方法会覆盖父类中的方法,
那么,如果我们想实现同时调用父类和子类中的同名方法,就需要使用到super()这个函数,用法为super().函数名()
下面是一个例子:
class A1():
def go(self):
print("go A1 go") class A2():
def go(self):
print("go A2 go") class A3():
def go(self):
print("go A3 go") class C(A3):
pass class B(A1,A2):
pass class D(B,C):
def go(self):
print("NMSL")
super().go() d1 = D()
d1.go()
print(D.__mro__)
输出结果为:
NMSL
go A1 go
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A1'>, <class '__main__.A2'>, <class '__main__.C'>, <class '__main__.A3'>, <class 'object'>)
这里的__mro__属性显示了当类调用方法时,如果父类和子类中有同名方法情况下的查找顺序。
如图,当我们实例化D类并调用类中的go方法时,go方法中有一条语句调用了父类的go方法,__mro__属性显示了如何查找这个方法(当然,自身类中的go方法不算),最后我们知道它调用的是A1类中的go方法,那么有些人会疑惑,为什么它不调用更近的的A3类或者A2类中go方法呢,这就要涉及到super()函数实现顺序查找的算法,这个算法即为C3算法。我的另一篇博客中记录了这个算法的原理。
假如D类中本身就没有go方法,那么我们再使用super()函数进行调用go方法,它会选择哪一个父类的呢?
代码如下:
class A1():
def go(self):
print("go A1 go") class A2():
def go(self):
print("go A2 go") class A3():
def go(self):
print("go A3 go") class C(A3):
pass class B(A1,A2):
pass class D(B,C):
def gogo(self):
print("NMSL")
super().go() d1 = D()
d1.gogo()
print(D.__mro__)
运行后输出结果:
NMSL
go A1 go
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A1'>, <class '__main__.A2'>, <class '__main__.C'>, <class '__main__.A3'>, <class 'object'>)
可以看到结果还是这样。
如果D类中不定义方法,仅仅在类的外部通过实例调用go方法,查找过程也是一样的。
如图:
class D(B,C):
pass
d1 = D()
d1.go()
print(D.__mro__)
结果:
NMSL
go A1 go
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A1'>, <class '__main__.A2'>, <class '__main__.C'>, <class '__main__.A3'>, <class 'object'>)
以上就是对于super()函数的个人看法。
Python3中的super()函数详解的更多相关文章
- Oracle中的substr()函数 详解及应用
注:本文来源于<Oracle中的substr()函数 详解及应用> 1)substr函数格式 (俗称:字符截取函数) 格式1: substr(string string, int a, ...
- python super()函数详解
引言: 在类的多继承使用场景中,重写父类的方法时,可能会考虑到需要重新调用父类的方法,所以super()函数就是比较使用也很必要的解决方法: 文章来源: http://www.cnblogs.com/ ...
- eclipse 设置文本模板中 insert variable... 函数 详解
设置文本模板简要图: 设置文本模板详细过程:http://www.cnblogs.com/lsy131479/p/8478711.html 此处引出设置文本模板中 insert variable... ...
- Oracle中的instr()函数 详解及应用
1)instr()函数的格式 (俗称:字符查找函数) 格式一:instr( string1, string2 ) / instr(源字符串, 目标字符串) 格式二:instr( strin ...
- oracle中的trim()函数详解
1.先看一下Oracle TRIM函数的完整语法描述 TRIM([ { { LEADING | TRAILING | BOTH }[ trim_character ]| trim_character} ...
- [fork]Linux中的fork函数详解
---------------------------------------------------------------------------------------------------- ...
- Python中的getattr()函数详解
最近看Dive into python第四章自省中提到getattr()函数,作为一个内建函数平时自己没怎么用过所以也不太理解这个函数的一些用法 看了下函数本身的doc getattr(object, ...
- MATLAB中的参数估计函数详解及调用示例【联合整理】
前言 因为最近项目上的需要,才发现MATLAB的统计工具箱中的参数估计函数,觉得很简单很好用,现在把所有的参数估计函数整理一下,并在最后面附上调用示例. 参与人员 由于时间关系,这篇随笔是两个人一起整 ...
- python中的 zip函数详解
python中zip()函数用法举例 定义:zip([iterable, ...]) zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple ...
随机推荐
- TransactionDefinition接口中定义了七个事务传播行为
1.PROPAGATION_REQUIRED如果存在一个事务,则支持当前事务,如果没有事务则开启一个新的事务.使用spring声明式事务,spring使用AOP来支持声明式事务,会根据事务属性,自动在 ...
- ES6类的继承
ES6 引入了关键字class来定义一个类,constructor是构造方法,this代表实例对象. constructor相当于python的init 而this 则相当于self 类之间通过ext ...
- ABP运行Login failed for user 'IIS APPPOOL XXXXX Reason: Could not find a login matching the name provided问题解决
我们在ABP官网上面生成解决方案后,编译完成,将数据库连接字符串中的Ip改成自己的测试数据库Ip直接在Vs里面调试运行没有任何问题. 发布之后到文件夹后运行,就报如下图异常. VS里面可以跑起来,单独 ...
- Channel 9视频整理【3】
Will 保哥 微软mvp https://channel9.msdn.com/Niners/Will_Huang 繁体中文视频 Visual Studio 2017 新功能探索 https://ch ...
- python3 实现删除数组中相同的元素
# #把数组中相同的元素去除 # #第一种方式: def del_repeatnum(s=[1,1,1,2,2,3,3,4]): s1=[] for i in s: print(i) if i not ...
- 019.MFC_两种对话框
对话框分为模态和非模态对话框两种 模态对话框(Modal) d.DoModal() 必须关闭才能返回主窗口 非模态对话框(Modaless) p->Create(IDD_DIALOG,this) ...
- tag的使用
tag = True while tag: print("level") choice = input("level>>>").strip() ...
- TCP/IP||UDP广播和多播
1.概述 广播和多播应用于UDP,TCP是一个面向连接协议,意味着分别运行与两个主机内的两进程间存在一个连接,在考虑多个主机内的共享通信网络,每个以太网帧包含源主机和目的主机以太网地址(48bit), ...
- codefoce 782c
好久没有更新了,特地来水一水 简单的涂色问题,大佬说基本都是贪心 #include<cstdio> #include<iostream> #include<vector& ...
- 20191031-3 beta week 1/2 Scrum立会报告+燃尽图 03
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/9913 git地址:https://e.coding.net/Eustia ...