1. 程式人生 > >關於元類的一些使用心得

關於元類的一些使用心得

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__方法初始化類對象

當元類存在時,並不是直接根據類的描述創建實例對象,而是攔截類的實例化。然後根據元類動態修改類的描述,最後根據修改後的類描述來創建對象。

關於元類的一些使用心得