導航:首頁 > 編程語言 > pythonsuper使用

pythonsuper使用

發布時間:2022-11-29 18:39:40

A. python中的Super詳解

這篇文章我們來介紹一下 super,我相信大部分的人使用 super 都是使用這種方式;

在我們常用 super 的時候都通常會認為 super 是一個方法或者函數,但是實際上 super 是一個正兒八經的 class,它是一個內置內的名字,然後 super() 並不是調用了一個函數 ,super() 是建立 了一個 super 的對象

盡管我們更常用的是 super() 括弧裡面什麼都沒有,但是 super 的完整版它裡面應該是有兩個參數,第一個參數是一個 type 也就是一個 class,第二個參數是一個 type 或者是一個 object,其中第二個參數決定了這一個函數綁定到那個 object 或者 class 上,同時第二個參數決定了使用那個 mro,而第一個參數決定了在 mro 鏈上 從哪個class 開始往後找,例如;

那麼這個 super(Male, self) 它是做了這樣一個事情,首先它要從 self 這個 object 裡面拿到 mro,然後他會找到第一個 argument,也就是 Male 在 mro 里所處的位置,那在當前的情況下 Male 就是最開始的那個(Male Person object)接下來他會從 Male 後面的那個 class 開始找,那它第一個找到的就是 Person,然後它就看Person 裡面有沒有 __init__ 這個函數,然後發現有這個函數,然後它在把這個 __init__ 綁定到 self 上,在這里可以理解為這個 Person 的 __init__ 函數傳進去的這個 self 就是 super 裡面的這個 self,也就是說 Person.__init__(self,name) 這行代碼等價於 super(Male, self).__init__(name) 這行代碼。

至於為什麼不直接使用 Person.__init__(self,name) 是有幾個原因:

在來看這個示例:

如果在 Male 中正常的使用它 super(Male, self).__init__(age, name) ,那麼它就會正常的初始化所有的東西,它會訪問這個 Person 的 __init__ ,然後 Person 的 __init__ 會訪問 Animal 的 __init__ ,最後就完成了這個 Male。

那如果把它改成 super(Person, self).__init__(age, name) ,那麼就會報錯,因為當我們使用 super(Person, self) 的時候,self 的 mro 鏈是 Male Person Animal 然後是 object,那第一個參數它由於是 Person,所以他會從 Person 後面的那個 class 也就是 Animal 開始找,那 Animal 是有 __init__ 函數的,但是 Animal 的 __init__ 只有一個參數 age,所以當我們傳入 age name 的時候那就錯了,這時候就只需要將它改成只傳進去一個 age 如: super(Person, self).__init__(age) 就可以了,同時也跳過了 Person。

super 並不是只能在 class 裡面使用的,它可以在任何一個地方使用,我只要給定 第二個參數 object 或者 class ,在給定第一個參數從哪裡開始找,我就能使用它的函數,例如:

文章來自https://www.cnblogs.com/XiaoYang-sir/p/16156355.html

B. python中的super是什麼-

目錄

python中的super,名為超類,可以簡單的理解為執行父類的__init__函數。由於在python中不論是一對一的繼承,還是一子類繼承多個父類,都會涉及到執行的先後順序的問題。那麼本文就著重看下super的具體作用。

通過設計這樣一個案例,我們可以明確super的前後邏輯關系:先定義一個父類 initial ,在這個父類中有參數值 param 和函數 func ,然後用子類 new 來繼承父類 initial 。繼承之後,在子類的 __init__ 函數中 super 執行的前後去列印參數值 param 和函數 func 的返回值,相關代碼如下所示:

代碼的執行結果如下所示:

首先我們注意到,父類 initial 中的 __init__ 函數內的列印語句,是在super之後才輸出的,這說明了, super 函數是在執行父類的初始化操作。那麼如果沒有執行 super , new 子類對 initial 父類的繼承體現在哪裡呢?答案就是父類的成員函數,比如這樣的一個案例:

其實就是刪掉了子類中重載的成員函數,那麼得到的結果如下:

可以發現在執行super之前就可以列印父類的 func 函數的函數值。所以python中繼承的邏輯是這樣的:

initial.func() new.__init__() new.func()/new.param super() initial.__init__()/initial.param new.__init__()/new.paraminitial.func() new.__init__() new.func()/new.param super() initial.__init__()/initial.param new.__init__()/new.param

也正是因為只有執行了 super 才能初始化父類中的成員變數,因此如果在super之前是無法訪問父類的成員變數的。

本文通過一個python的實際案例的設計,來講解python面向對象的技術——類的繼承中必用的super函數的邏輯。其實我們可以把python中類的繼承理解成這樣的一個過程:當我們在括弧中明確了父類時,其實已經引用了父類的成員函數,但是並沒有執行父類的初始化函數。在執行子類的初始化函數的同時,會檢查是否重載了父類的成員函數,如果重載則會直接覆蓋。而只有在執行了super之後,才相當於執行了父類的初始化函數,此時才可以訪問父類的成員變數。

本文首發鏈接為:https://www.cnblogs.com/dechinphy/p/super.html

作者ID:DechinPhy

更多原著文章請參考:https://www.cnblogs.com/dechinphy/

打賞專用鏈接:https://www.cnblogs.com/dechinphy/gallery/image/379634.html

騰訊雲專欄同步:https://cloud.tencent.com/developer/column/91958

C. python中super的使用

Yes, and since py3.5, `super(Man, self).__init__(name, has_wife)` can be replaced as below:

super().__init__(name,has_wife)
閱讀全文

與pythonsuper使用相關的資料

熱點內容
伺服器怎麼用不會斷電 瀏覽:301
主從伺服器有什麼用 瀏覽:213
jstlpdf 瀏覽:14
安卓原神在哪個app下載 瀏覽:808
單片機編程技術什麼意思 瀏覽:104
e點課堂源碼 瀏覽:45
免費打擊墊app哪個好 瀏覽:532
程序員必裝的6款軟體 瀏覽:750
基於單片機的遙控器設計 瀏覽:521
安卓如何取消圓圖標 瀏覽:11
收件伺服器怎麼樣 瀏覽:48
建築設計規范pdf 瀏覽:98
如何合並兩個pdf 瀏覽:174
刷機包必須要解壓的單詞 瀏覽:483
android課表實現 瀏覽:864
頭條app在哪裡能看見有什麼活動 瀏覽:511
冰櫃壓縮機電容80歐 瀏覽:609
安卓各個版本圖標什麼樣 瀏覽:152
無錫哪裡有製作手機app 瀏覽:538
php字元串轉json數組 瀏覽:6