一、在Python类的方法(method)中,要调用父类的某个方法,可以有如下写法
class A(object):
def __init__(self):
print "enter A"
print "leave A"
class B(A):
def __init__(self):
print "enter B"
A.__init__(self)
print "leave B"
b=B()
结果
enter B
enter A
leave A
leave B
如果B的父类改变为C,如上例子只需要修改2处而已(将B类中的A换成C),这种调用方法在代码量大的情况下不可取,即引入super机制
官网解释super(type[, object-or-type]):
返回type的父类,如果第二个参数遗漏,则父类是非绑定的,如果第二个参数为object,则isinstance(obj,type)需为真,如果第二个参数为type,则issubclass(type2,type)需为真,super()必须作用于新式类。
改写如下(绑定),其中self是B的一个实例:
class A(object):
def __init__(self):
print "enter A"
print "leave A"
class B(A):
def __init__(self):
print "enter B"
super(B,self).__init__()
print "leave B"
b=B()
二、多重继承情况:
非绑定情况
class A(object):
def __init__(self):
print "enter A"
print "leave A"
class B(A):
def __init__(self):
print "enter B"
A.__init__(self)
print "leave B"
class C(B,A):
def __init__(self):
print "enter C"
B.__init__(self)
A.__init__(self)
print "leave C"
c=C()
enter C
enter B
enter A
leave A
leave B
enter A
leave A
leave C
看出A被调了2次,改用super,
class A(object):
def __init__(self):
print "enter A"
print "leave A"
class B(A):
def __init__(self):
print "enter B"
super(B,self).__init__()
print "leave B"
class C(B,A):
def __init__(self):
print "enter C"
super(C,self).__init__()
print "leave C"
c=C()
结果:
enter C
enter B
enter A
leave A
leave B
leave C
这里只被调用一次
三、多重继承机制
python super多重继承机制为mro(Method resolution order)
比如上面的例子MRO即为 C B A ,super调用的为MRO中的下一个方法
class A(object):
2 def __init__(self):
3 print "A"
4 super(A,self).__init__()
5 class B(object):
6 def __init__(self):
7 print "B"
8 super(B,self).__init__()
9 class C(A):
10 def __init__(self,arg):
11 print "c","arg=",arg
12 super(C,self).__init__()
13 class D(B):
14 def __init__(self,arg):
15 print "D","arg=",arg
16 super(D,self).__init__()
17
18 class E(C,D):
19 def __init__(self,arg):
20 print "E","arg=",arg
21 super(E,self).__init__(arg)
22 E(1)
期望输出:
E arg=1
C arg=1
A
D arg=1
E
实际输出
E arg= 10
c arg= 10
A
Traceback (most recent call last):
File "super_test.py", line 22, in <module>
E(10)
File "super_test.py", line 21, in __init__
super(E,self).__init__(arg)
File "super_test.py", line 12, in __init__
super(C,self).__init__()
File "super_test.py", line 4, in __init__
super(A,self).__init__()
TypeError: __init__() takes exactly 2 arguments (1 given)
首先 MRO顺序为E C A D B
调用继续到A.__init__时,我们调用了super(A,self).__init__,其实调用了mro中下一个类型的方法,也就是
D中的__init__,由于D的 __init__带有1个参数,所以报错
所以如果要解决参数匹配的问题,建议采用*arg,**kwargs作为参数,所有的类也都采用super
分享到:
相关推荐
Superkids1总结.pdf
superobject总结PPT学习教案.pptx
这是java学习总结出来的关于super的内容,供学习参考。
关于2024年之前局部特征匹配算法总结,匹配不止superpoint,总结了特征匹配的多种主流方法,包括基于cnn和transformer以及基于检测与无检测模型的算法,其中基于检测的模型包括先检测后描述、联合检测和描述以及先...
在本篇文章里我们给大家总结了关于C#SuperSocket的搭建并配置启动的相关内容,正在学习的朋友们跟着参考下。
Superteddy5全册知识点总结.pdf
总结了Java学习中的52个关键字(包括一些总结),如果觉得自己Java基础知识需要总结一下的,可以下载下来瞧瞧 2.this和super 1>在你的方法中的某个刑参名与当前对象的某个成员有相同的名字,这 时为了不至于混淆,...
14.java学习第十四章——super()关键字+实例变量(含引用数据类型做实例变量)和局部变量的个人总结+基本数据类型和引用数据类型的存放位置.pdf
对计算机视觉(cv)以及自然语言处理(NLP)两个热门的方向的技术进行总结概述.
【大厂面试题总结】JavaSE面试题总结详细教程: 目录: 递归算法之输出某个目录下所有文件和子目录列表 泛型中extends和super的区别 内部类的理解 深入理解Java的反射机制 深入理解Java异常体系 谈谈NIO的理解 谈一...
学习deep learning for image super-resolution论文后总结出的ppt
主要介绍了Java this super代码实例及使用方法总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
样本项目总结了“ UGUI Super ScrollView”的用法示例。 版 Unity 2017.3.0f3 UGUI超级ScrollView 2.2.3 警告 该存储库不包括“ UGUI Super ScrollView”。 因此,如果您要运行Unity项目, 您需要从Asset Store...
SQL学习总结create database supermarket on (name=supermarket_data, filename='e:\\sql\\supermarket.mdf', size=1) log on
1.子类继承父类就拥有了父类的属性和方法。(代码的可重用) !!!父类的构造方法子类不能继承 2.... 3....默认隐式调用父类无参数的构造方法 ...使用super(参数列表),但是这行代码必须是在 子类的构造方法的第一行。
return super.onOptionsItemSelected(item); } //1实力化 private void m1() { etUserName=(EditText) this.findViewById(R.id.etUserName); etPassword=(EditText) this.findViewById(R.id.etPassword); ...
实现控制台输入结算收银 收银员管理 销售物品管理
我将网上这些博主的文章进行一个梳理总结,最后形成一套实用的关于super、mro、C3的理解介绍。 1、super super()是一种将子类与父类联系起来的一种方法,子类通过继承父类,可以使用父类的方法和属性,也可以自己...
this 和 super 访问控制权限继承 多态组合代理 向上转型static final 接口和抽象类接口 抽象类异常 认 识 Exception 什么是 Throwable 常见的 Exception 与 Exception 有关的 Java 关键字 throws 和 throw try 、...