python中的super
Ⅰ Super()函数
1.super()函数就是用来调用父类(超类)的一个方法.
2.super()函数是用来解决多重继承问题的,直接用类名调用父类的方法在使用的时候消宴没有问题,但是如果使用多继承,会涉及到查找顺序、重复调用等等问题.
下面,我们重点理解第二句话,在使用python 类的时候,经常会遇到__init__()这样一个函数,其实这就是python的构造方法.
构造乎世方法类似于init()这种初始化方法,来初始化新创建对象的状态在一个对象被创建之后以后会被立刻岁桥肢调用.
class Foobar:
def __init__(self):
self.somever = 42
f = Foobar()
f.smoever
我们发现在初始化Foobar中somever中的值为42之后,实例化就可以直接调用somever的值;如果之前我们没有构造方法初始化的话,就不能调用.
现在,我们就可以使用super()函数来解决这个问题了,如下
原因就是super()函数会查找所有的超类,以及超类的超类,知道找到所需的特性为止.
Ⅱ python中super关键字的使用
案例一:单继承时super关键字的使用:
log:
解释:这里的慧穗扮super强制调用了父类的方法,不仅仅是__init__方法,也可以是强前灶制调用父类普通方法(如cry)
案例二:多继承时super的使用
先不看cry方法,只看__init__方法,原理都是一样的,这里的哈士奇和金毛都继承了Dog类,而杂交犬继承了金毛和哈士奇
看一下log:
虽然只创建了一个dog3对象,但是分别调用了Dog,Husky,Golden的__init__方法。
案列三:不使用super关键字,写一下多继承:
用父类直接族老调用自己的__init__方法
看一下log:
可以发现这里多打印了一句“普通狗狗的眼睛是黑色”,也就是说多调用了一次Dog()的__init__()方法
总结:所以super可以用来强制调用父类方法(包括__init__方法,和其他自定义方法),但是super可以避免多继承时重复调用父类方法。
Ⅲ 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()函数的意义,最好浅显易懂,以及用法,谢谢
调用父类, 和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的使用
Yes, and since py3.5, `super(Man, self).__init__(name, has_wife)` can be replaced as below:
super().__init__(name,has_wife)
Ⅵ python语句(具体如下)super的用法不理解,求大神指教!本人初学者,刚刚开始学习中。。。
super().xxx的作用是调用父类的xxx方法,在重写xxx方法时,这个方法的内容已经和原方法完全无关了,因此如果希望在重写之后仍然能执行原方法的逻辑,就需要使用super().xxx来调用父类的原方法。
Ⅶ 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