时间:2021-05-22
描述
super() 函数是用于调用父类(超类)的一个方法。
super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。
MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表。
语法
以下是 super() 方法的语法:
super(type[, object-or-type])
Python中类的初始化都是__init__(), 所以父类和子类的初始化方式都是__init__(), 但是如果子类初始化时没有这个函数,那么他将直接调用父类的__init__(); 如果子类指定了__init__(), 就会覆盖父类的初始化函数__init__(),如果想在进行子类的初始化的同时也继承父类的__init__(), 就需要在子类中显示地通过super()来调用父类的__init__()函数。
super()在单继承中的应用:
举个例子:
class Animal: #定义一个父类 def __init__(self): #父类的初始化 self.name = 'animal' self.role = 'parent' print('I am father')class Dog(Animal): #定一个继承Animal的子类 def __init__(self): #子类的初始化函数,此时会覆盖父类Animal类的初始化函数 print('I am son') self.name = 'dog' #定义子类的name属性 super(Dog,self).__init__() #在子类进行初始化时,也想继承父类的__init__()就通过super()实现 #self.name = 'dog' #若将name属性的定义(即第10行)放在这儿,最终输出将是dog animal = Animal()xbai = Dog()print(xbai.name)print(xbai.role)输出为:
I am father #实例化Animal类后的输出I am son #实例化Dog类后的输出I am father #实例化Dog类后的输出animal #由于子类初始化是在进行继承父类初始化之前,因此super()执行后,Dog类的name属性被父类覆盖parent #继承了父类的role属性说明:super(Dog,self)也可以写成super(),可以理解成super(Dog,self).__init__() == Animal.__init__(self),( super(Dog,self) == Animal ) 即其返回的是当前类的继承顺序中(针对多继承)Dog后的一个类(也即类Animal)
self 和 super的区别:
super()在多继承中的应用:
代码例子:
class Base(object): #定义父类 def __init__(self): print('Base create')class ChildA(Base): #子类A def __init__(self): print('Enter A') super(ChildA,self).__init__() print('Leave A')class ChildB(Base): def __init__(self): print('Enter B') super(ChildB,self).__init__() self.name = 'B' print('Leave B')class ChildC(ChildA,ChildB):#在继承时,按照继承顺序返回继承顺序的下一个类 pass## (这里需要介绍的是,当类继承多个类时,python3中是按照广度优先算法,即在类ChildC的继承关系中,会先找到靠近其的基类ChildA,然后继承其的初始化函数__init__(),就不会再继承ChildB的初始化函数)c = ChildC() #实例化对象print(c.__class__.__mro__) #对象c的继承顺序应该是 ChildC---ChildA---ChildB---Base---object输出结果:
Enter A
Enter B
Base create
Leave B
Leave A
(<class '__main__.ChildC'>, <class '__main__.ChildA'>, <class '__main__.ChildB'>, <class '__main__.Base'>, <class 'object'>)
整个执行过程,当实例化对象c时,按照类的继承顺序,先初始化类ChildC(),由于C中未定义初始化函数__init__(),因此直接调用其继承的基类ChildA的__init__()初始化方法,运行到代码行第8行时,按照继承顺序super(ChildA,self)返回的是类ChildB(),因此,super(ChildA,self).__init__() == ChildB().__init__(self),因此就可以理解产生输出结果的原理。
从super()方法中可以看出,super()的第一个参数可以是继承链(继承顺序)中的任意一个类的名字,也可以不填,不填时第一个参数默认为当前类,即代码第10行 super(ChildA,self).__init__() ==super().__init__(),其返回值为在继承链中输入参数类的下一个类。
结论:
总结
以上所述是小编给大家介绍的python类中super() 的使用解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
一、super函数简介python内置函数super()主要用于类的多继承中,用来查找并调用父类的方法,所以在单重继承中用不用super都没关系;但是,使用su
python使用super()出现错误解决办法当我们在python的子类中调用父类的方法时,会用到super(),不过我遇到了一个问题,顺便记录一下。比如,我写
为什么需要super在python没有引入super之前,如果需要在子类中引用父类的方法,一般写法如下:classFather:defwhoami(self):
前言python的类分别有新式类和经典类,都支持多继承。在类的继承中,如果你想要重写父类的方法而不是覆盖的父类方法,这个时候我们可以使用super()方法来实现
本文实例讲述了Python中super关键字用法。分享给大家供大家参考。具体分析如下:在Python类的方法(method)中,要调用父类的某个方法,在Pyth