python的super
㈠ python 关于super的疑问
MRO(Method resolution order)是python用来解析方法调用顺序的,mro中记录了一个类的所有基类的类类型序列,super不是简单地调用基类的方法,而是按照MRO中的顺序来调用类的方法。
使用super()时,应该在所有类中使用,否则就可能发生有的类构造函数没有调用的情况。
#!/usr/bin/python
# -*- coding: utf-8 -*-
class A(object):
def __init__(self):
print 'A __init__'
super(A, self).__init__()
print 'leave A'
class C(object):
def __init__(self):
print 'C __init__'
super(C, self).__init__()
print 'leave C'
class B(A,C):
def __init__(self):
print 'B __init__'
super(B, self).__init__()
print 'leave B'
class D(B):
def __init__(self):
print 'D __init__'
super(D, self).__init__()
print 'leave D'
if __name__ == '__main__':
D()
输出为:
D __init__
B __init__
A __init__
C __init__
leave C
leave A
leave B
leave D
㈡ Python中的super函数有什么用,怎么用 图片中的super中后面的参数代表啥
super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。总之前人留下的经验就是:保持一致性。要不全部用类名调用父类,要不就全部用 super,不要一半一半。
你这里面super(SongBird,self).__init__()就相当于
Bird.__init__(self)
㈢ python语句(具体如下)super的用法不理解,求大神指教!本人初学者,刚刚开始学习中。。。
super().xxx的作用是调用父类的xxx方法,在重写xxx方法时,这个方法的内容已经和原方法完全无关了,因此如果希望在重写之后仍然能执行原方法的逻辑,就需要使用super().xxx来调用父类的原方法。
㈣ python中的super()是什么意思呢
super就是在子类中调用父类方法时用的。
classFooParent(object):
def__init__(self):
self.parent='I'mtheparent.'
print'Parent'
defbar(self,message):
printmessage,'fromParent'
classFooChild(FooParent):
def__init__(self):
super(FooChild,self).__init__()#调用父类初始化方法
print'Child'
defbar(self,message):
super(FooChild,self).bar(message)#调用父类bar方法
print'Childbarfuction'
printself.parent
if__name__=='__main__':
fooChild=FooChild()
fooChild.bar('HelloWorld')
如果解决了您的问题请采纳!
如果未解决请继续追问
㈤ python的类和对象中的super函数的问题
问题一
因为在B类中调用了super方法,所以没有执行完B类就去执行C类的程序
super方法在多重继承程序中的调用顺序,采用的是C3算法(在python3中)。
C3算法的规则如下
①.从底层开始,选择入边为零的点。
②.从左到右。
③深度探索。但受限于②规则。
每一个类都可以用mro函数查看自己的继承顺序(MRO全称Method Resolution Order,就是用来定义继承方法的调用顺序)
对于你的程序
分析
①规则。得到D类,去掉D类以后,入边为零的是B类和C类
②规则。选择B类,去掉B类后,入边为零的只有C类。结论是D–>B–>C–>A。
在d=D()语句前加print(D.mro()),就可以打印出D类的继承顺序
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
问题二
python3的继承不同于普通的继承,super函数已经考虑到了重复继承的问题,所以对于A类只访问一次
㈥ python中super为什么能解决多重继承问题
1. super 并不是一个函数,是一个类名,形如 super(B, self) 事实上调用了 super 类的初始化函数,产生了一个 super 对象;
2. super 类的初始化函数并没有做什么特殊的操作,只是简单记录了类类型和具体实例;
3. super(B, self).func 的调用并不是用于调用当前类的父类的 func 函数;
4. Python 的多继承类是通过 mro 的方式来保证各个父类的函数被逐一调用,而且保证每个父类函数只调用一次(如果每个类都使用 super);
5. 混用 super 类和非绑定的函数是一个危险行为,这可能导致应该调用的父类函数没有调用或者一个父类函数被调用多次。
6. 用 super,遇到修改父类的名字时等情况
㈦ python,super(Bullet,self)是什么意思
Bullet的父类是Sprite,
super(Bullet,self).__init__() 的意思是初始化父类是python 2.7版本。在python 3中也可以简写为super().__init__()
当子类有构造函数的时候,继承父类后,如果想要调用父类的方法或者属性就需要在子类构造函数中初始化父类
如果子类没有新的构造函数,那么继承后就可以直接使用父类的方法或属性,而不需要在子类构造函数中重新初始化父类
㈧ 一个python类有两个超类,为什么super
某个时候你觉得Parent名字不好了,改成MyParent,结果不得不把每个子类都改一遍 另外给一个类获得父类只能用super,比如: def get_super(cls):
㈨ python中super()函数的意义,最好浅显易懂,以及用法,谢谢
调用父类, 和parent一个意思. 只不过python使用的继承方式有点特别, 所以用起来有点特别
php"><?php
classA
{
functionhello()
{
print"A ";
}
}
classSonOfA
{
functionhello()
{
parent::hello();
}
}
那么在python里就是通过 super(A, self) 获得指向父类的指针(当成指针好了), 然后调用hello.
super(A,self).hello()#相当于呼叫A的hello
#据说python3,可以
super().hello()
㈩ python super函数
classA:
defprint1(self):
print('A')
classB:
defprint2(self):
super().print1()
b=B()
b.print2()
注意 self。默认的调用方式是调用绑定方法的。