super在python中有什麼用

2021-09-21 05:40:55 字數 2403 閱讀 6927

所屬**分類: python高階 > 物件導向

有什麼區別?

class child(somebaseclass):

def __init__(self):

super(child, self).__init__()

class child(somebaseclass):

def __init__(self):

somebaseclass.__init__(self)

我們已經看到super在只有單繼承的類中使用了很多,但也可以在多重繼承中使用它,那麼在這種情況下使用它的優點是什麼?

somebaseclass.__init__(self)
意味著呼叫somebaseclass的__init__。而

super(child, self).__init__()
表示__init__從child例項的方法解析順序(mro)中的父類呼叫繫結。

如果例項是child的子類,則mro中可能會有另乙個父級。

我玩了一下super(),並且認識到我們可以改變呼叫順序。

a

/ \b c

\ /d

在這種情況下,d的mro將是(僅適用於python 3):

in [26]: d.__mro__

out[26]: (__main__.d, __main__.b, __main__.c, __main__.a, object)

讓我們建立乙個super()執行後呼叫的類。

in [23]: class a(object): #  or with python 3 can define class a:

...: def __init__(self):

...: print("i'm from a")

...:

...: class b(a):

...: def __init__(self):

...: print("i'm from b")

...: super().__init__()

...:

...: class c(a):

...: def __init__(self):

...: print("i'm from c")

...: super().__init__()

...:

...: class d(b, c):

...: def __init__(self):

...: print("i'm from d")

...: super().__init__()

...: d = d()

...:

i'm from d

i'm from b

i'm from c

i'm from a

a/ ⇖

b ⇒ c

⇖ /d

因此我們可以看到解決方案順序與mro中的相同。但是當我們super()在方法的開頭呼叫時:

in [21]: class a(object):  # or class a:

...: def __init__(self):

...: print("i'm from a")

...:

...: class b(a):

...: def __init__(self):

...: super().__init__() # or super(b, self).__init_()

...: print("i'm from b")

...:

...: class c(a):

...: def __init__(self):

...: super().__init__()

...: print("i'm from c")

...:

...: class d(b, c):

...: def __init__(self):

...: super().__init__()

...: print("i'm from d")

...: d = d()

...:

i'm from a

i'm from c

i'm from b

i'm from d

我們有乙個不同的順序,它顛倒了mro元組的順序。

a

/ ⇘b ⇐ c

⇘ /d

python基本操作 super

一 單繼承 只繼承乙個父類,父類沒有繼承其他父類 classa object def init self print i am class a class c a def init self super c,self init print yes super c,self init 這句話的解釋是 ...

python深坑集錦 super

一 前言 python 物件導向中有繼承這個概念,初學時感覺很牛逼,裡面也有個super類,經常見到,最近做一些題才算是理解了。特地記錄分享給後來研究的小夥伴,畢竟現在小學生都開始學了 滑稽臉 二 直接上乾貨,能把下面乙個問題全答對,後面就不用看了。class a def go self print...

Python中super的用法

super 是用來解決多重繼承問題的,直接用類名呼叫父類方法在使用單繼承的時候沒問題,但是如果使用多繼承,會涉及到查詢順序 mro 重複呼叫 鑽石繼承 等種種問題。總之前人留下的經驗就是 保持一致性。要不全部用類名呼叫父類,要不就全部用 super,不要一半一半。普通繼承 python view p...