国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

深入理解Python中的super()方法

2020-02-16 10:47:41
字體:
來源:轉載
供稿:網友

前言

python的類分別有新式類和經典類,都支持多繼承。在類的繼承中,如果你想要重寫父類的方法而不是覆蓋的父類方法,這個時候我們可以使用super()方法來實現

python語言與C++有相似的類繼承,在類定義時,python中會自定義第一個self,類似C++中this指針,指向對象自身。

python簡單的類舉例:

>>> class hello(object): ...     def print_c(): ...       print"hello world!" >>> hello().print_c() hello world! 

當然在實際中不可避免的需要類的繼承,子類繼承父類,正常如下:

>>> class child(hello): ...     def print_c(self): ...         hello().print_c() ...          >>> child().print_c() hello world! 

在python中還提供了super()機制,例子如下:

>>> class hello(object): ...     def print_c(self): ...       print"hello world!" ...        >>> class child(hello): ...     def print_c(self): ...         super(child,self).print_c() ...          >>> child().print_c() hello world! 

注意

Python2.2以前的版本:經典類(classic class)時代

經典類是一種沒有繼承的類,實例類型都是type類型,如果經典類被作為父類,子類調用父類的構造函數時會返回這樣的錯誤 '''TypeError: must be type, not classobj'''

這時MRO的方法為DFS(深度優先搜索(子節點順序:從左到右))。所以本文中使用的是新式類,而新式類的搜索算法是C3算法

class C(object): def minus(self,x):  return x/2class D(C): def minus(self,x):  super(D, self).minus()  print 'hello'

上面的代碼中C是父類,D是子類,我們在D類重新定義了minus方法,就是在C類的功能基礎基礎上新添print 'hello'功能。super在這里的作用就是在子類中調用父類的方法,這個也是在單繼承常見調用super()的用法。那么問題來了

class A(object): def __init__(self):  self.n = 10 def minus(self, m):  self.n -= mclass B(A): def __init__(self):  self.n = 7 def minus(self, m):  super(B,self).minus(m)  self.n -= 2b=B()b.minus(2)print b.n

那么上面的代碼中b.n的輸出是什么呢?為什么結果是2呢,而不是5呢?super(B,self).minus(m)明明是調用了父類的minus方法,可是輸出結果就是2,是你要明白現在B的實例,而不是A的實例,那么傳遞的self.n的數值是7,而不是10.

那么對于多繼承的時候,super又是怎樣工作的呢?來,現在創建一個繼承A的C類,然后再創建一個繼承B,C的D類,看看怎樣調用super是重寫方法。

class C(A): def __init__(self):  self.n = 12 def minus(self, m):  super(C,self).minus(m)  self.n -= 5class D(B, C): def __init__(self):  self.n = 15 def minus(self, m):  super(D,self).minus(m)  self.n -= 2d=D()d.minus(2)print d.n            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 邵东县| 上杭县| 吕梁市| 宿州市| 石河子市| 游戏| 鹿邑县| 沛县| 伊宁市| 青岛市| 安顺市| 西畴县| 安吉县| 阳城县| 石林| 格尔木市| 九龙坡区| 元谋县| 顺昌县| 郴州市| 阜平县| 沂源县| 神农架林区| 柞水县| 政和县| 沂南县| 宁远县| 平江县| 获嘉县| 田林县| 仁怀市| 贵州省| 郑州市| 河津市| 碌曲县| 东宁县| 伽师县| 长治县| 色达县| 灵台县| 赤壁市|