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