python super 作用和原理

2022-09-13 08:09:15 字數 3518 閱讀 7691

python 在類的繼承中,當前類中如果方法與基類(父類)的方法一樣,會覆蓋基類的方法。

class

base(object):

defrun(self):

print("

base start running~~")

class

dog(base):

defrun(self):

print("

dog start running~~")

if__name__ == "

__main__":

dog().run()#結果

dog start running~~process finished with exit code 0

上面****中,基類base 並沒有執行,但是有些時候,定義基類就是把共同的**寫在一起,在呼叫當前方法是,我們基類中已經實現的公共部分。

類的繼承

經典類(classic class) 基類名.方法名(self, *args, **kwargs), python版本低於2.2

新式類(new-style class) super(當前類名, self).方法名(*args, **kwargs), python 版本大於2.2

1

class

base(object):

2def

run(self):

3print("

now start running~~")

45class

dog(base):

6def

run(self):

7base.run(self) # 經典類繼承

8print("

dog start running~~")

910if__name__ == "

__main__":

11dog().run()

1213#結果

14 now start running~~

15 dog start running~~

1617 process finished with exit code 0

當使用經典類繼承時,dog->base->object 這種簡單的繼承順序還可以,如果出現多重繼承時,就會有下面的結果:

1

class

base(object):

2def

__init__

(self):

3print("

進入base 類")

456class

a(base):

7def

__init__

(self):

8print("

進入a 類")

9 base.__init__

(self)

1011

12class

b(base):

13def

__init__

(self):

14print("

進入b 類")

15 base.__init__

(self)

1617

18class

c(a, b):

19def

__init__

(self):

20print("

進入c 類")

21 a.__init__

(self)

22 b.__init__

(self)

2324

25if

__name__ == "

__main__":

26 c = c()

執行結果:

1

進入c 類

2進入a 類

3進入base 類

4進入b 類

5進入base 類

67 process finished with exit code 0

我們不難發現,執行順序: c -> a -> base -> b -> base

是不是順序有點蒙,我們理想狀態的順序難道不應該是:c -> a -> b -> base(在繼承多個類時,繼承順序從左往右依次繼承)

如果按照理想狀態執行應該怎麼辦, 我們就要用到super了。

1

class

base(object):

2def

__init__

(self):

3print("

進入base 類")

456class

a(base):

7def

__init__

(self):

8print("

進入a 類")

9 super(a, self).__init__

() # python2.7 的寫法

1011

12class

b(base):

13def

__init__

(self):

14print("

進入b 類")

15 super().__init__

()16

1718

class

c(a, b):

19def

__init__

(self):

20print("

進入c 類")

21 super().__init__

() # python3 繼承的寫法

2223

24if

__name__ == "

__main__":

25 c = c()

結果:

1

進入c 類

2進入a 類

3進入b 類

4進入base 類

56 process finished with exit code 0

這樣是不是就跟我們預想的一致了。

下面簡單說一下super 是怎麼執行的:

mro 

簡單說一下 mro(method resolution order),中文可以叫做方法解析順序,  在方法呼叫時,需要對當前類以及基類進行搜尋確定方法位置。

在程式中可以使用:

print(c.mro())

結果:

['__main__.c

'>, '__main__.a

'>, '__main__.b

'>, '__main__.base

'>, 'object

'>]

python mro

python3 統一使用 c3 線性化演算法,有興趣的可以自行搜尋。

小結

分析mybatis和jdbc的作用,已經原理

從jdbc的運算元據庫來看 主要分為幾步 1 註冊載入jdbc驅動程式 2 得到連線物件 connection 3 建立 statement物件 4 執行sql語句 5 處理結果 6 關閉資源釋放資源 mybatis 在這個方面 首先進行載入xml檔案,然後建立sqlfactory來進行操作,myb...

Transactional事務不起作用原因補充

今天,使用 transactional,但是事務卻不起作用,配置確定配置成功,在網上查詢資料,在每個每個原因都試了之後仍然無效,最終發現,原來他們都漏了乙個原因,而我正好是這個原因。因為spring容器和spring mvc是父子容器,spring容器會先載入,如果此時掃瞄了controller,但...

簡述網絡卡的作用和工作原理 過流繼電器工作原理和作用

過流繼電器工作原理 過流繼電器是一種用於保護電動機 變壓器等主裝置的繼電保護裝置,該產品具有定時限 反時限的特性,當主裝置或輸配電系統出現過負荷及 過電流或短路故障時,過流繼電器可以按照預定的時限可靠動作或發出訊號,切除故障部分,從而達到保護主裝置及輸配電系統的目的。過流繼電器的工作原理是複合式的,...