本文參考自《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...