python中的super 函式

2021-08-20 19:27:05 字數 3041 閱讀 9757

最能感受到super函式的作用在於進行鑽石繼承的時候。

鑽石繼承:由乙個基類衍生兩個及以上的超類,然後在衍生,在類樹的最底層生成乙個子類,這樣的類樹結構就是乙個類似 鑽石外形,所以,最底層類繼承稱為鑽石繼承

首先:

這是直接通過超類呼叫方法給子類使用

class

baseclass:

num_base_calls = 0

defcall_me

(self):

print("calling method on base class")

self.num_base_calls += 1

class

leftsubclass

(baseclass):

num_left_calls = 0

defcall_me

(self):

baseclass.call_me(self)

print("calling method on left subclass")

self.num_left_calls += 1

class

rightsubclass

(baseclass):

num_right_calls = 0

defcall_me

(self):

baseclass.call_me(self)

print("calling method on right subclass")

self.num_right_calls += 1

class

subclass

(leftsubclass, rightsubclass):

num_sub_calls = 0

defcall_me

(self):

rightsubclass.call_me(self)

leftsubclass.call_me(self)

print("calling method on subclass")

self.num_sub_calls += 1

s = subclass()

print(s.call_me())

print(s.num_sub_calls, s.num_left_calls, s.num_right_calls, s.num_base_calls)

結果是:

calling method on

base

class

calling method on

right

subclass

calling method on

base

class

calling method on

left

subclass

calling method on

subclass11

12

這是通過super()函式實現繼承

class

baseclass:

num_base_calls = 0

defcall_me

(self):

print("calling method on base class")

self.num_base_calls += 1

class

leftsubclass

(baseclass):

num_left_calls = 0

defcall_me

(self):

super().call_me()

print("calling method on left subclass")

self.num_left_calls += 1

class

rightsubclass

(baseclass):

num_right_calls = 0

defcall_me

(self):

super().call_me()

print("calling method on right subclass")

self.num_right_calls += 1

class

subclass

(leftsubclass, rightsubclass):

num_sub_calls = 0

defcall_me

(self):

super().call_me()

print("calling method on subclass")

self.num_sub_calls += 1

# 使用super()例項化乙個超類物件可以實現,每個層次只是進行且只進行一次呼叫

# 就拿這個例子來說

s = subclass()

print(s.call_me())

print(s.num_sub_calls, s.num_left_calls, s.num_right_calls, s.num_base_calls)

結果是:

calling method

onbase

class

calling

method

onright

subclass

calling

method

onleft

subclass

calling

method

onsubclass

1 1 1 1

通過以上兩個測試,第乙個我們用超類直接呼叫他的方法在子類中實現了繼承,但是我們看到這樣的話每個超類都會在呼叫自身的call_me方法的同時也會呼叫超類的超類中的call_me方法,這樣,baseclass就被執行了兩次。第二個我們使用了super()方法在call_me方法中繼承了超類的方法,這樣就像注釋裡說的,它會根據繼承的層次乙個乙個類的呼叫,所以baseclass類並不會被呼叫兩次。這就是super()函式的作用

python中super函式的用法

super的正確傳參有兩種 super 類名,物件名 和super 類名1,類名2 來自wowcpp博主 引數必須要滿足的條件 super cls,obj 即傳入類名 物件名 obj物件必須是cls類的物件 cls子類的物件當然也是cls類的物件 記作 type obj cls 2.super cl...

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,不保證在其他版本直譯器下得到相同結果,也不打算...