python中super函式的用法

2021-10-22 20:32:24 字數 2491 閱讀 1946

super的正確傳參有兩種:super(類名,物件名)和super(類名1,類名2)來自wowcpp博主

引數必須要滿足的條件:

super(cls,obj)即傳入類名+物件名:

obj物件必須是cls類的物件(cls子類的物件當然也是cls類的物件),記作 type(obj) <= cls

2.super(cls1,cls2)即傳入兩個類名:

cls2必須是cls1的子類或本身,記作cls2<=cls1

super起到**作用,通過傳入的兩個類引數,定位你希望呼叫的 繼承鏈中x父類中重寫的同名方法,即super(cls1,cls2).fun是通過類cls1,類cls2,定位類x,並使用x類中的fun(self, …)方法

super的作用:

可以避免直接使用父類的名字,主要用於多重繼承。如果你要改變子類繼承的父類,只需要修改一行**就可以了,而不需要在大量**中去查詢修改。

在類的繼承中,重寫父類的方法而不是覆蓋父類的方法。

單繼承的時候,可以不用使用,但是在編寫**中加上super().__init__()是乙個好的習慣

super().__init__() 其中super()返回父級的物件。__init__()方法是構造器的乙個方法。

例子1:

在下面的例子中,在子類去呼叫方法的時候,遇到了super,super的作用是繼承父類,但是不覆蓋他,說明我們還需要呼叫父類的方法。

class a(object):

def __init__(self):

self.n = 10

def minus(self, m):

self.n -= m

class b(a):

def __init__(self):

self.n = 7

def minus(self, m):

super(b,self).minus(m)

self.n -= 2

class c(a):

def __init__(self):

self.n = 12

def minus(self, m):

super(c, self).minus(m)

self.n -= 5

class d(b, c):

def __init__(self):

self.n = 15

def minus(self, m):

super(d, self).minus(m) # 最後結果是6

print(self.n) # 輸出結果為6

self.n -= 2

d = d() #初始化,呼叫 class d的__init__方法

d.minus(2) # 呼叫class d的minus方法,其中按照mro的繼承順序,執行的路線是d-b-c-a。在執行的過程中只呼叫父類的minus方法,並且方法中的n是子類中的n。為什麼不是父類的呢?因為父類沒有初始化。然後從a執行完了之後,開始class d中的minus中的方法最後一句:self.n- =2

print(d.n)

# 輸出的結果是 4

為了加深理解,我們對**再次進行修改,在每個類中加上super().__init__()

class a(object):

def __init__(self):

self.n = 10

super(a, self).__init__()

def minus(self, m):

self.n -= m

class b(a):

def __init__(self):

self.n = 7

super(b, self).__init__()

def minus(self, m):

super(b,self).minus(m)

self.n -= 2

class c(a):

def __init__(self):

self.n = 12

print('11111')

super(c, self).__init__()

def minus(self, m):

super(c, self).minus(m)

self.n -= 5

class d(b, c):

def __init__(self):

self.n = 15

print('ssssss')

super(d, self).__init__()

def minus(self, m):

print(self.n)

self.n -= 2

d = d()

d.minus(2)

print(d.n) #輸出最後的結果是 8,不知道你自己算對了不

關於super的內部機制

python中的super 函式

最能感受到super函式的作用在於進行鑽石繼承的時候。鑽石繼承 由乙個基類衍生兩個及以上的超類,然後在衍生,在類樹的最底層生成乙個子類,這樣的類樹結構就是乙個類似 鑽石外形,所以,最底層類繼承稱為鑽石繼承 首先 這是直接通過超類呼叫方法給子類使用 class baseclass num base c...

python之類中的super函式

作用 實現 重用 思考 super真的只是呼叫父類麼?super函式是按照mro演算法去呼叫的,不bb上 class a def init self print a class b a def init self print b super init class c a def init self ...

python中的super函式及MRO

super 函式是用於呼叫父類 超類 的乙個方法。super是用來解決多重繼承問題的,直接用類名呼叫父類方法在使用單繼承的時候沒問題,但是如果使用多繼承,會涉及到查詢順序 mro 重複呼叫 鑽石繼承 等種種問題。此篇部落格所用直譯器為python3.x,不保證在其他版本直譯器下得到相同結果,也不打算...