5分钟了解 Python 中的super函数是如何实现继承的
Py 2.x 和 Py 3.x 中有一個(gè)很大的區(qū)別就是類,無(wú)論是類的定義還是類的繼承。Py 3.x 中類的繼承可以直接使用 super() 關(guān)鍵字代替原來(lái)的 super(Class, self)。
那么 super() 到底是依據(jù)什么來(lái)繼承的呢?今天就來(lái)分析下。
super()函數(shù)根據(jù)傳進(jìn)去的兩個(gè)參數(shù)具體作用如下:
-
通過(guò)第一參數(shù)傳進(jìn)去的類名確定當(dāng)前在MRO中的哪個(gè)位置。MRO(Method Resolution Order);
-
通過(guò)第二個(gè)參數(shù)傳進(jìn)去的self,確定當(dāng)前的MRO列表。
如下代碼:
''' 遇到問(wèn)題沒(méi)人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書(shū)! ''' class A(object):def name(self):print('name is xiaoming') #super(A,self).name()class B(object): def name(self):print('name is cat')class C(A,B):def name(self):print('name is wang')super(C,self).name()if __name__ == '__main__':c = C() print(c.__class__.__mro__) c.name()執(zhí)行以上代碼輸出:當(dāng)執(zhí)行C類下的super()函數(shù)時(shí),實(shí)際調(diào)用了A類下的name函數(shù)。A中注釋掉了super()函數(shù),所以并沒(méi)有向后繼續(xù)執(zhí)行。并且打印出了當(dāng)前MRO列表順序?yàn)镃,A,B,object.
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)name is wangname is xiaoming當(dāng)我們把A類中的注釋去掉后,執(zhí)行代碼輸出:可以看到,當(dāng)A執(zhí)行后繼續(xù)執(zhí)行了B中的name()函數(shù)。如果B中仍然有super函數(shù)則會(huì)繼續(xù)向上去查找object中是否有name()函數(shù)。
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)name is wangname is xiaomingname is總結(jié)
以上是生活随笔為你收集整理的5分钟了解 Python 中的super函数是如何实现继承的的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Python格式化字符串知多少
- 下一篇: Python69个内置函数分类总结