關於元類的一些使用心得
阿新 • • 發佈:2017-08-10
col 作業 數據 如果 屬性信息 一個 mod 魔法 分析
作廖老師的Python實戰作業時,對元類這個魔法方法有些小心得。
元類這個黑魔法和linux中root都是bug般的存在,不想糾纏概念性東西,試著從Python解釋器的角度分析下元類的執行過程。
其實,元類的主要作用盡在這三句話中:
1.攔截類的創建
2.修改類
3.返回修改後的類
普通類調用__new__方法產生實例對象,而元類通過type.__new__創建新的類。
1 class ModelMetaclass(type): 2 #采集應用元類的子類屬性信息 3 #將采集的信息作為參數傳入__new__方法 4 #應用__new__方法修改類 5 def __new__(cls,name,bases,attrs): 6 ... 7 return type.__new__(cls,name,bases,attrs)
1 class Model(dict,metaclass=ModelMetaclass): 2 ...
我們定義一個元類ModelMetaclass和一個應用元類的Model類。
1 model = Model(**kw)
當我們用Model類創建一個model實例對象,python解釋器執行過程如下:
1.發現元類
2.應用元類。通過元類的__new__創建類對象,__new__方法首先從Model類的類定義中搜集屬性和方法信息作為字典數據傳入__new__的attrs參數中;用戶對收集的信息刪減增添修改,生成新的attrs參數;調用type.__new__方法,並把新的attrs參數傳入該方法中,即返回一個新的類對象。
3.如果存在__init__方法,在第二步即生成類對象後調用__init__方法初始化類對象
當元類存在時,並不是直接根據類的描述創建實例對象,而是攔截類的實例化。然後根據元類動態修改類的描述,最後根據修改後的類描述來創建對象。
關於元類的一些使用心得