元類 :python
若是一切皆對象,而調用一個類,會實例化出一個對象,那把類看作一個對象,這個類A也就是調用了一個另外一個類B而生成的對象,另外一個類B就叫作元類。類A=類B(....)spa
在以前,咱們能夠經過type來肯定一個對象的所屬類型(即這個對象所屬類):對象
如print(type(1))>>>>>>>>> <class ‘int’> ——— 1 是屬於int這個類的。繼承
實際相對於調用type元類傳入參數1,生成一個int類。字符串
那麼類A是屬於哪一個類呢:print(type(A))>>>>>> <class ‘type’>it
說明類A這個對象是屬於type這個類的。即默認元類爲type(內置的元類)。元類能夠簡稱爲類所屬的類,即類的類。模板
class關鍵字定義的類自己也是一個對象。負責產生該對象的類稱爲元類。class
Class關鍵字在建立類的時候,必然調用了內置元類type。即type( )方法
傳入的參數又是什麼呢?必然是:call
3.類的名稱空間(字典):類的名稱在執行類體代碼而獲得,調用type時會依次傳入以上三個參數。
綜上所述:class建立類的流程爲:
1.拿到類名>>2.拿到類的基類們(元組)>>3.執行類體代碼體,拿到類的名稱空間(字典)>>4.調用元類獲得類。
3.exec(‘python代碼’,全局,局部)
第一個參數是包含python代碼的字符串,該內置方法會自動執行字符串中的代碼,且將產生的名字放到對應的名稱空間。若是字符串中沒有聲明是全局,會默認放到局部空間。
參數二是用來接受全局的名稱空間。
參數三是局部名稱空間。
必須包含三個參數,不然報錯。且參數二參數三是字典類型。
4.重點:
類的產生過程就是調用元類的過程:
類=元類(類名,(基類們,),{名稱空間})
自定義一個元類的方式:繼承元類type。
能夠利用自定義元類(做用):
自定義元類中的__init__須要的參數就是類名、基類(元組)、名稱空間(字典)是給重用繼承type中__init__用的,而後在下面再跟上一些邏輯做爲控制(限制、規範)產生的類
那麼調用類其實是調用元類中的__call__。
以上是__call__的模板(可添加其餘限制。)