python python元類

2022-01-10 17:40:35 字數 970 閱讀 4468

這兩天在看django框架,裡面的filter實現原理搞不明白,最後發現跟python的元類有關係.

原文:

元類本身而言,它們其實是很簡單的:

1)   攔截類的建立

2)   修改類

3)   返回修改之後的類

這樣的作用是什麼呢?

攔截類的建立,也就是不通過type()的方法,和預設引數進行建立類。這樣做的好處就是可以在__init__例項之前,做你想做的事情。

也就是所謂的修改類。

我認為,修改類,不強大,強大的是:如果加入一行**,就可以把所有想修改的類一次性修改了,那真是太cool,元類就可以做到。

所以就要解釋一下:建立一個類的時候,過程是什麼樣的?

class foo(object):

pass

foo中有__metaclass__這個屬性嗎?如果是,python會在記憶體中通過__metaclass__建立()一個名字為foo的類物件(我說的是類物件,請緊跟我的思路)。如果python沒有找到__metaclass__,它會繼續在bar(父類)中尋找__metaclass__屬性,並嘗試做和前面同樣的操作。如果python在任何父類中都找不到__metaclass__,它就會在模組層次中去尋找__metaclass__,並嘗試做同樣的操作。如果還是找不到__metaclass__,python就會用內建的type來建立這個類物件。

也就是說,我只要在父類中有類的構建方法,就會影響子類。如果子類要是不像繼承父類的metaclass,那麼就可以通過__metaclass__指定類時,用的方法。(也就是定製類)

我看完之後,依然不敢說完全瞭解元類是怎麼玩。只能知道為什麼要有個元類,使用它的好處,以及看得懂發生了什麼,現在的水平還能拿下它的節奏。

“當你不知道要不用的元類的時候,那你肯定不需要用它。”

Python 異常

當檢測到一個錯誤時,直譯器就無法繼續執行了,反而出現了一些錯誤的提示,這就是所謂的 異常 。 例如 以 r 方式開啟一個不存在的檔案。 op...

python筆記

1 enumerate的函式詳解 enumerate 用於遍歷陣列中的元素以及他們的下標 eg for i j enumerate a b...

python 抽象方法

我的理解抽象方法就是 父類的一個方法,繼承的所有子類都必須要實現這個方法,否則報錯。 class base object def metho...