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