Python中super( )的用法

2021-03-02 學點編程吧
問題的發現與提出

在Python類的方法(method)中,要調用父類的某個方法,在Python 2.2以前,通常的寫法如代碼段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

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

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

因此,自Python 2.2開始,Python添加了一個關鍵字super,來解決這個問題。下面是Python3.5的官方文檔說明:https://docs.python.org/3.5/library/functions.html?highlight=super#super

二維碼直達

super([type[, object-or-type]])

調用父類或兄弟類的方法返回給代理對象。這對訪問在類中被覆蓋的父類繼承方法很有用。

super有兩種典型的用例。在具有單一繼承的類層次結構中,super可以用於引用父類,而不用明確地命名它們,從而使代碼更易於維護。這種用法與其他程式語言中的調用父類用法非常類似。

典型的父類調用如下所示:

class C(B):    def method(self, arg):        super().method(arg)    # This does the same thing as:                               # super(C, self).method(arg)

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

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

class B(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的方法。

相關焦點

  • Python: 你不知道的 super
    () 的入門使用在類的繼承中,如果重定義某個方法,該方法會覆蓋父類的同名方法,但有時,我們希望能同時實現父類的功能,這時,我們就需要調用父類的方法了,可通過使用 super 來實現,比如:class Animal(object):    def __init__(self, name):        self.name = name
  • Python新式類的方法解析順序MRO與Super
    新式類:廣度優先的C3算法實現(拓撲排序) BFS python2.3及以後python 用MRO的目的是什麼解決多重繼承的二義性的問題(二義性:父類存在同名函數的時候會產生二義性)為python調用一個類或者實例方法的時候提供查找順序經典類的方法解析順序深度優先算法:
  • Java中this和super的用法總結
    這幾天看到類在繼承時會用到this和super,這裡就做了一點總結,與各位共同交流,有錯誤請各位指正~thisthis是自身的一個對象,代表對象本身,可以理解為:指向對象本身的一個指針。this的用法在java中大體可以分為3種:1.普通的直接引用這種就不用講了,this相當於是指向當前對象本身。
  • Java之super關鍵字的用法
    各為小夥伴們大家好,這次小編要介紹的是Java當中super關鍵字的用法,在上面的文章中小編有講過,super關鍵字是用來調用父類之間的成員變量和成員方法。現在小編來總結一下super關鍵字的用法。具體如下:1.在子類的成員方法中,訪問父類的成員變量。2.在子類的成員方法中,訪問父類的成員方法。3.在子類的構造方法中,訪問父類的構造方法。
  • 詳解Python中的import的用法
    import語句用來導入其他python文件(稱為模塊module),使用該模塊裡定義的類、方法或者變量,從而達到代碼復用的目的。為了方便說明,我們用實例來說明import的用法,讀者朋友可以跟著嘗試(嘗試時建議使用python3,python2和python3在import的表現有差異,之後會提到)。
  • python中*的用法
    學習python語言的初學者,每每看到他人的代碼裡這樣寫python方法的入參,總是犯難疑惑,不明所以:今天,我以比較簡單的舉例,跟大家說說python中*這個字符的特殊用法。c': 3}]def add(a,b,c): print(a + b + c)for i in datas: add(i['a'], i['b'], i['c'])for i in datas: add(**i)一如既往,總結一下:*的妙用,可以很大程度降低代碼的複雜程度,特別是當你的自動化腳本的不同用例方法中有相同的入參時
  • 淺析H3C交換機super命令的用法
    淺析H3C交換機super命令的用法 H3C交換機super命令設置的口令用於低級別用戶向高級別用戶切換時進行驗證,類似於UNIX系統和Linux系統中從普通用戶轉換到root帳戶時須輸入super進行切換。
  • python中int函數的其他用法
    泰山版初中信息技術第1冊python編程中出現了int函數,教材中int函數的作用是把輸入的字符型數字轉變成整數,其實int函數還有其他的用法
  • 使用Python Super()為類提供繼承支持
    在本教程中,您將了解以下內容:Python中的繼承概念Python中的多重繼承super()函數如何工作單繼承中的super()函數如何工作多繼承中的super()函數如何工作Python的super()函數概述如果您有使用面向對象語言的經驗
  • Python for循環及用法詳解
    圖 1 for 循環語句的執行流程圖下面的程序演示了 for 循環的具體用法:add = "http://c.biancheng.net/python/"#for循環,遍歷 add 字符串for ch in add: print(ch,end="")運行結果為:
  • 掌握這兩個方法:助你學會Python 中所有函數(方法)的功能與用法
    python語言已經接觸過python的讀者應該都對python海量的內置函數有所了解,這些函數把我們原本在C/C++等語言中需要手動實現的功能(如排序/字符串組合/查找)都用最優化的代碼封裝成了內置函數,可供開發者直接調用
  • python中函數的基礎用法
    python中的內置函數提供了基礎功能,在實際開發中,我們需要將這些基礎功能進行搭配組合,來有效解決我們的問題。如何將我們自己構建的代碼作為一個可復用的工具,最基本的方法就是寫成函數。通過函數可以減少代碼冗餘,提高編碼效率。
  • Python中break語句用法詳解!
    這篇文章主要介紹了詳解Python中break語句的用法,是Python入門的呼出知識,需要的朋友可以參考下 在Python中的break
  • Python continue的用法
    和 break 語句相比,continue 語句的作用則沒有那麼強大,它只會終止執行本次循環中剩下的代碼,直接從下一次循環繼續執行。
  • 詳解Python中的__init__和__new__的區別
    例如:這樣便是__init__最普通的用法了。但__init__其實不是實例化一個類的時候第一個被調用 的方法。當使用 Persion(name, age) 這樣的表達式來實例化一個類時,最先被調用的方法 其實是 __new__ 方法。二、__new__ 方法是什麼?
  • Python sorted函數及用法
    下面程序演示了 sorted() 函數的基本用法:a = [5,3,4,2,1]print(sorted(a))a = (5,4,3,1,2)print(sorted(a))a = {4:1,\ 5:2,\ 3:3,\ 2:6,\ 1:8}print(sorted(a.items
  • 【135】python中self的用法
    內容目錄(原文見公眾號python寶)一、self代表類的實例二、self 舉例三、self用法詳解一、self代表類的實例
  • python中str內置函數用法總結
    大家在使用python的過程中,應該在敲代碼的時候經常遇到str內置函數,為了防止大家搞混,本文整理歸納了str內置函數。
  • 說說Python中with的用法?
    廢話不多說,開始今天的題目:問:說說Python中with的用法?答:Python 文件使用完畢後必須關閉,因為文件對象會佔用作業系統的資源,並且作業系統同一時間能打開的文件數量也是有限的。但是由於文件讀寫時都有可能產生IOError,一旦出錯,後面的f.close()就不會調用。
  • 年薪30萬的騰訊公司Python工程師面試題曝光!漲知識了!
    1、請儘可能列舉python列表的成員方法,並給出一下列表操作的答案:(1) a=[1, 2, 3, 4, 5], a[::2]=?, a[-2:] = ?(2) 一行代碼實現對列表a中的偶數位置的元素進行加3後求和?