python3super用法_Python3中的super()函数详解
關(guān)于Python3中的super()函數(shù)
我們都知道,在Python3中子類在繼承父類的時(shí)候,當(dāng)子類中的方法與父類中的方法重名時(shí),子類中的方法會(huì)覆蓋父類中的方法,
那么,如果我們想實(shí)現(xiàn)同時(shí)調(diào)用父類和子類中的同名方法,就需要使用到super()這個(gè)函數(shù),用法為super().函數(shù)名()
下面是一個(gè)例子:
classA1():defgo(self):print("go A1 go")
classA2():defgo(self):print("go A2 go")
classA3():defgo(self):print("go A3 go")
classC(A3):pass
classB(A1,A2):pass
classD(B,C):defgo(self):print("NMSL")
super().go()d1=D()
d1.go()print(D.__mro__)
輸出結(jié)果為:
NMSL
go A1 go
(, , , , , , )
這里的__mro__屬性顯示了當(dāng)類調(diào)用方法時(shí),如果父類和子類中有同名方法情況下的查找順序。
如圖,當(dāng)我們實(shí)例化D類并調(diào)用類中的go方法時(shí),go方法中有一條語句調(diào)用了父類的go方法,__mro__屬性顯示了如何查找這個(gè)方法(當(dāng)然,自身類中的go方法不算),最后我們知道它調(diào)用的是A1類中的go方法,那么有些人會(huì)疑惑,為什么它不調(diào)用更近的的A3類或者A2類中g(shù)o方法呢,這就要涉及到super()函數(shù)實(shí)現(xiàn)順序查找的算法,這個(gè)算法即為C3算法。我的另一篇博客中記錄了這個(gè)算法的原理。
假如D類中本身就沒有g(shù)o方法,那么我們?cè)偈褂胹uper()函數(shù)進(jìn)行調(diào)用go方法,它會(huì)選擇哪一個(gè)父類的呢?
代碼如下:
classA1():defgo(self):print("go A1 go")classA2():defgo(self):print("go A2 go")classA3():defgo(self):print("go A3 go")classC(A3):pass
classB(A1,A2):pass
classD(B,C):defgogo(self):print("NMSL")
super().go()
d1=D()
d1.gogo()print(D.__mro__)
運(yùn)行后輸出結(jié)果:
NMSL
go A1 go
(, , , , , , )
可以看到結(jié)果還是這樣。
如果D類中不定義方法,僅僅在類的外部通過實(shí)例調(diào)用go方法,查找過程也是一樣的。
如圖:
class D(B,C):
pass
d1 =D()
d1.go()print(D.__mro__)
結(jié)果:
NMSL
go A1 go
(, , , , , , )
以上就是對(duì)于super()函數(shù)的個(gè)人看法。
總結(jié)
以上是生活随笔為你收集整理的python3super用法_Python3中的super()函数详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。