Python學習日記 子類化內建方法和MRO

2021-10-01 23:19:00 字數 1951 閱讀 1088

本文參考自《python高階程式設計》第二版第三章

子類化內建類是簡單高效實現內建類相似行為型別的方法,在編寫新類之前,都可以考慮一下是否能夠子類化內建類,書中給出了乙個無法修改已存在鍵的字典,這裡寫乙個只能有固定鍵的字典

class

nosuchkeyerror

(valueerror):.

..class

fixdict

(dict):

fix_key =

['name'

,'age'

,'height'

]def

__setitem__

(self, key, value)

:if key not

in self.fix_key:

raise nosuchkeyerror(

'key {} is not in fixed key {}'

.format

(key, self.fix_key)

)else

:super()

.__setitem__(key, value)

fixdict子類化了內建方法dict,只能有固定的三個鍵name、age和height,設定其他鍵都會引發nosuchkeyerror,鍵合法時則呼叫父類方法設定

mro全稱是method resolution order,即方法解析順序,書中給出了在複雜繼承關係下python3的mro

class

commonbase

:def

method

(self)

:print

('common base'

)class

base1

(commonbase)

:def

method

(self)

:print

('base1'

)class

base2

(commonbase)

:def

method

(self)

:print

('base2'

)class

myclass

(base1,base2):.

..if __name__ ==

'__main__'

: mc = myclass(

) mc.method(

)print

(myclass.mro(

))

這是乙個菱形的繼承,最終輸出為

base1

[<

class

'__main__.myclass'

>

,<

class

'__main__.base1'

>

,<

class

'__main__.base2'

>

,<

class

'__main__.commonbase'

>

,<

class

'object'

>

]

當我們建立新類後,類的mro方法給出了方法解析順序,在我們呼叫method方法後,類會按照這個解析順序來尋找method方法,將找到的第乙個method方法作為結果,因為myclass沒有method,所以呼叫的是mrc列表中最靠前且有method方法的base1.method(),python3中mro構建序列的方式就是,先對每個父類進行地櫃深度查詢得到乙個列表序列,然後如果某個類包含在多個列表中,就會利用層次結構消歧

python2和python3的mro不同,在多重繼承時,python2會使用從左到右、深度優先的方式來尋找method方法,此時找到的就會是commanbase.method()

學習 MFC子類化

視窗子類化 是建立乙個新的視窗函式代替原來的視窗函式。簡單說來,子類化是靠攔截windows系統中的某些訊息來自己進行處理。自己實現的是子類化乙個編輯框,對編輯框輸入的內容進行限制 只允許0 9 空格 乙個點 定義乙個ceditdemo標頭檔案 邏輯順序 1 在視窗的初始化函式中得到想要子類化的視窗...

python學習日記1 python內建序列

python包含6中內建的序列,即列表 元組 字串 unicode字串 buffer物件和xrange物件 注 準確的來說,在python中是沒有陣列型別的,python中取而代之的是列表和元組。列表比元組好用,因為元組一旦定義就沒法修改。索引序列中所有的元素都是有編號的 從0開始遞增。可以通過編號...

qt學習第四課 子類化視窗

在本節課中,學習了如何子類化乙個視窗,在下面就以經常用到的查詢對話方塊為例 具體的執行結果如下 這個對話方塊就是乙個基於qdialog的子類。具體 如下 ifndef cfiledialog h define cfiledialog h include include include include...