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

首頁 > 編程 > Python > 正文

Python中的super用法詳解

2020-02-23 01:28:26
字體:
來源:轉載
供稿:網友

一、問題的發現與提出

在Python類的方法(method)中,要調用父類的某個方法,在Python 2.2以前,通常的寫法如代碼段1:

代碼段1:
代碼如下:
 class A:
  def __init__(self):
   print "enter A"
   print "leave A"

 class B(A):
  def __init__(self):
   print "enter B"
   A.__init__(self)
   print "leave B"

 >>> b = B()

 enter B
 enter A
 leave A
 leave B

即,使用非綁定的類方法(用類名來引用的方法),并在參數列表中,引入待綁定的對象(self),從而達到調用父類的目的。

  這樣做的缺點是,當一個子類的父類發生變化時(如類B的父類由A變為C時),必須遍歷整個類定義,把所有的通過非綁定的方法的類名全部替換過來,例如代碼段2,

 代碼段2:
代碼如下:
 class B(C):    # A --> C
  def __init__(self):
   print "enter B"
   C.__init__(self) # A --> C
   print "leave B"

如果代碼簡單,這樣的改動或許還可以接受。但如果代碼量龐大,這樣的修改可能是災難性的。

  因此,自Python 2.2開始,Python添加了一個關鍵字super,來解決這個問題。下面是Python 2.3的官方文檔說明:
代碼如下:
 super(type[, object-or-type])

  Return the superclass of type. If the second argument is omitted the super object
  returned is unbound. If the second argument is an object, isinstance(obj, type)
  must be true. If the second argument is a type, issubclass(type2, type) must be
  true. super() only works for new-style classes.

  A typical use for calling a cooperative superclass method is:

   class C(B):
       def meth(self, arg):
           super(C, self).meth(arg)

  New in version 2.2.

  從說明來看,可以把類B改寫如代碼段3:

 代碼段3:
代碼如下:
 class A(object):    # A must be new-style class
  def __init__(self):
   print "enter A"
   print "leave A"

 class B(C):     # A --> C
  def __init__(self):
   print "enter B"
   super(B, self).__init__()
   print "leave B"

 嘗試執行上面同樣的代碼,結果一致,但修改的代碼只有一處,把代碼的維護量降到最低,是一個不錯的用法。因此在我們的開發過程中,super關鍵字被大量使用,而且一直表現良好。

  在我們的印象中,對于super(B, self).__init__()是這樣理解的:super(B, self)首先找到B的父類(就是類A),然后把類B的對象self轉換為類A的對象(通過某種方式,一直沒有考究是什么方式,慚愧),然后“被轉換”的類A對象調用自己的__init__函數。考慮到super中只有指明子類的機制,因此,在多繼承的類定義中,通常我們保留使用類似代碼段1的方法。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 昌图县| 海城市| 绥化市| 新巴尔虎左旗| 临颍县| 泌阳县| 凉山| 定结县| 克东县| 天等县| 三原县| 万荣县| 深泽县| 昌乐县| 新昌县| 崇礼县| 荣昌县| 华蓥市| 茶陵县| 凌海市| 安乡县| 子长县| 比如县| 信宜市| 新晃| 青冈县| 贵溪市| 忻城县| 体育| 洞头县| 宜丰县| 浮山县| 靖州| 高青县| 疏勒县| 耒阳市| 登封市| 临汾市| 玛纳斯县| 安图县| 和林格尔县|