python 在類的繼承中,當前類中如果方法與基類(父類)的方法一樣,會覆蓋基類的方法。
classbase(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
1class
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 這種簡單的繼承順序還可以,如果出現多重繼承時,就會有下面的結果:
1class
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了。
1class
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,但...
簡述網絡卡的作用和工作原理 過流繼電器工作原理和作用
過流繼電器工作原理 過流繼電器是一種用於保護電動機 變壓器等主裝置的繼電保護裝置,該產品具有定時限 反時限的特性,當主裝置或輸配電系統出現過負荷及 過電流或短路故障時,過流繼電器可以按照預定的時限可靠動作或發出訊號,切除故障部分,從而達到保護主裝置及輸配電系統的目的。過流繼電器的工作原理是複合式的,...