pythonsuper繼承
⑴ python super().init()作用
對於python里的super(). init ()有什麼作用,很多同遲余學沒有弄清楚。
直白的說super(). init (),就是繼承父類的init方法,同樣可以使用super()點 其他方法名,去繼承其他方法。
下面通過三個不同的繼承猜侍並碼兆滾調用,對比他們的區別,搞清楚super(). init ()的用途。
文章摘自: https://blog.csdn.net/a__int__/article/details/104600972
⑵ python中super關鍵字的使用
案例一:單繼承時super關鍵字的使用:
log:
解釋:這里的慧穗扮super強制調用了父類的方法,不僅僅是__init__方法,也可以是強前灶制調用父類普通方法(如cry)
案例二:多繼承時super的使用
先不看cry方法,只看__init__方法,原理都是一樣的,這里的哈士奇和金毛都繼承了Dog類,而雜交犬繼承了金毛和哈士奇
看一下log:
雖然只創建了一個dog3對象,但是分別調用了Dog,Husky,Golden的__init__方法。
案列三:不使用super關鍵字,寫一下多繼承:
用父類直接族老調用自己的__init__方法
看一下log:
可以發現這里多列印了一句「普通狗狗的眼睛是黑色」,也就是說多調用了一次Dog()的__init__()方法
總結:所以super可以用來強制調用父類方法(包括__init__方法,和其他自定義方法),但是super可以避免多繼承時重復調用父類方法。
⑶ 11.詳解python中super()函數原理及常用實例
type--類,object-or-type--類,一般是self
運行發現:super().add(x) 與A.add(self,x)執行結果一致;但涉及多繼承,發現super()只衫漏調用一次
在super機制里可以保證公共父類僅被執行一次,至於執行的順序嫌旅,是按照MRO(Method Resolution Order):方法解析順序 進行的
super()可以調用父類中的任何方法,超(父類的父類)類的任何方法;可重寫父類同名的 init 函數,及其他方法
在任何時候繼承類和重寫方法的,我或者爛們應當用到args, kwargs將接收到的位置參數和鍵值參數給父類方法
⑷ python的類和對象中的super函數的問題
問題一
因為在B類中調用了super方法,所以沒有執行完B類就去執行C類的程序
super方法在多重繼承程序中的調用順序,採用的是C3演算法(在python3中)。
C3演算法的規則如下
①.從底層開始,選擇入邊為零的點。
②.從左到右。
③深度探索。但受限於②規則。
每一個類都可以用mro函數查看自己的繼承順序(MRO全稱Method Resolution Order,就是用來定義繼承方法的調用順序)
對於你的程序
分析
①規則。得到D類,去掉D類以後,入邊為零的是B類和C類
②規則。選擇B類,去掉B類後,入邊為零的只有C類。結論是D–>B–>C–>A。
在d=D()語句前加print(D.mro()),就可以列印出D類的繼承順序
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
問題二
python3的繼承不同於普通的繼承,super函數已經考慮到了重復繼承的問題,所以對於A類只訪問一次
⑸ 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
⑹ 使用python的super時出現的TypeError: must be type, not classobj 原因及解決
示例如下:
但是運行報錯:TypeError: must be type, not classobj
查找資料之後發現,python中super只能應用於襪拿睜新類,而不能應用於經典類
所謂新類 : 就是所有類都必須要有繼承的類,如果什麼都不想繼承,就繼承到告歲object類。下面是一個新類的例子
所謂經典類 : 就是什麼都不用繼承的類,例如:
產上上面的問題,而自己又不知道父類該繼承什麼,最簡單的方法就是讓它去繼承object類敏談,例如:
⑺ python中super為什麼能解決多重繼承問題
1. super 並不是一個函數,是一個類名,形如 super(B, self) 事實上調用了 super 類的初始化函數,產生了一個 super 對象;
2. super 類的初始化函數並沒有做什麼特殊的操作,只是簡單記錄了類類型和具體實例;
3. super(B, self).func 的調用並不是用於調用當前類的父類的 func 函數;
4. Python 的多繼承類是通過 mro 的方式來保證各個父類的函數被逐一調用,而且保證每個父類函數只調用一次(如果每個類都使用 super);
5. 混用 super 類和非綁定的函數是一個危險行為,這可能導致應該調用的父類函數沒有調用或者一個父類函數被調用多次。
6. 用 super,遇到修改父類的名字時等情況
⑻ Python3中的super()函數
super()函數碧畝沖的用處是調用當前類的父類函數。在要調用父類的函數之外,還需要加一點別的操作的時候,特別有用。
例:
結果是:
上面是單繼承的例子,用super()而悔殲不是直接用父類的名字去調用父類函數的好處是耐談不用管父類的名字。即使父類改名了,super()的調用依然有效。
多重繼承的時候需要根據MRO來決定調用順序。詳見官方文檔:
⑼ python中super的使用
Yes, and since py3.5, `super(Man, self).__init__(name, has_wife)` can be replaced as below:
super().__init__(name,has_wife)
⑽ Python類繼承自object為什麼要super自己的方法
super不是指向父類, 而是指向mro中的下一個類, 所以你繼承的這個mixin子類, 他會去繼承另外一個類, 源碼裡面是ListView, 所以super返回的是ListView.
class A(object):
def __init__(self):
print(self.__class__.__mro__)
def bark(self):
print("I'm A")
super(A, self).bark()
class B(object):
def bark(self):
print("I'm B")
class C(A, B):
def bark(self):
print("I'm C")
super(C, self).bark()
if __name__ == '__main__':
c = C()
c.bark()
運行結果:
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'objec
t'>)
I'm C
I'm A
I'm B
因為源碼裡面是
class IndexView(BaseMixin,ListView):
所以BaseMixin裡面調用的super(BaseMixin, self).get_context_data(**kwargs), 實際上是調用的ListView的方法