轉載自:https://blog.csdn.net/killeri/article/details/80717322
最能感受到super函數的作用在於進行鑽石繼承的時候。
鑽石繼承:由一個基類衍生兩個及以上的超類,然後在衍生,在類樹的最底層生成一個子類,這樣的類樹結構就是一個類似 鑽石外形,所以,最底層類繼承稱爲鑽石繼承
首先:
這是直接通過超類調用方法給子類使用
class baseClass:
num_base_calls = 0
def call_me(self):
print("Calling method on Base Class")
self.num_base_calls += 1
class leftSubClass(baseClass):
num_left_calls = 0
def call_me(self):
baseClass.call_me(self)
print("Calling method on left SubClass")
self.num_left_calls += 1
class rightSubClass(baseClass):
num_right_calls = 0
def call_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
def call_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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
結果是:
Calling method on Base Class
Calling method on right SubClass
Calling method on Base Class
Calling method on left SubClass
Calling method on SubClass
1 1 1 2
1
2
3
4
5
6
這是通過super()函數實現繼承
class baseClass:
num_base_calls = 0
def call_me(self):
print("Calling method on Base Class")
self.num_base_calls += 1
class leftSubClass(baseClass):
num_left_calls = 0
def call_me(self):
super().call_me()
print("Calling method on left SubClass")
self.num_left_calls += 1
class rightSubClass(baseClass):
num_right_calls = 0
def call_me(self):
super().call_me()
print("Calling method on right SubClass")
self.num_right_calls += 1
class SubClass(leftSubClass, rightSubClass):
num_sub_calls = 0
def call_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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
結果是:
Calling method on Base Class
Calling method on right SubClass
Calling method on left SubClass
Calling method on SubClass
1 1 1 1
1
2
3
4
5
通過以上兩個測試,第一個我們用超類直接調用他的方法在子類中實現了繼承,但是我們看到這樣的話每個超類都會在調用自身的call_me方法的同時也會調用超類的超類中的call_me方法,這樣,baseClass就被執行了兩次。第二個我們使用了super()方法在call_me方法中繼承了超類的方法,這樣就像註釋裏說的,它會根據繼承的層次一個一個類的調用,所以baseClass類並不會被調用兩次。這就是super()函數的作用