python中的super()函數

轉載自: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()函數的作用
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章