您的位置:首頁>正文

它是Python造物主,一篇文章理解最難懂的概念

龜叔發明了 Python, 然後集成了一堆概念在這門語言裡面, 比如:反覆運算器, 裝飾器, 函數, 生成器, 類, 物件, 協程等等。

這些概念對初學者似乎沒一個好懂的, 不過還有比這更難的概念, 它是 Python 世界中的造物主, 雖然我們很少去直接使用它, 但天天都在用, 它就是今天的主角------元類。

今天我的任務就是徹底明白什麼是元類, 看懂了別忘了給我點個贊, 分享給更多人。

要搞懂元類, 我們還是先從物件說起。

物件(Object)

Python 一切皆物件, 這句話你一定有聽說過(現在你就聽說了), 一個數位是物件, 一個字串是物件, 一個清單是物件,

一個字典是物件, 例如:

>>> i = 10>>> s = "abc">>> nums = [1,2,3]>>> dicts = {"name":"zhang"}

等號右邊是物件, 左邊是給這些物件取的名字, 任何物件都有3個關鍵屬性:標識、值、類型。

標識

標識就和人的身份證ID一樣, 每個物件有唯一ID標識, 在整個生命週期中都不會變, 你可以認為標識是這個物件在電腦記憶體中的位址。 通過函數 id() 可以查看物件的ID標識。

>>> id(i)40592592>>> id(s)44980584

物件值

物件的第二個屬性是值, 值很好理解, 比如 i 的值是 10, s 的值是 abc, nums 的值就是 1,2,3。

類型

物件還有一個很重要的屬性就是類型, 任何物件都有屬於自己的類型, 物件就是由它的類型構造出來的。

比如上面 i 的類型是 int 類型, s 類型是字串類型, nums 的類型是列表類型, dicts 的類型是字典類型, 它們都是由對應的類型構建出來的。

通過 type() 可以查看物件的類型。

>>> type(i)>>> type(s)>>> type(nums)>>> type(dicts)

物件的類型也和ID標識一樣不會改變。

唯一可能變的就是值。

類與(實例)物件

除了系統已經定義好了的整數類型, 字串類型, 清單等類型之外, 我們還可以創建自己的類型, 用關鍵字 class 來定義。 例如:

>>> class Person: # 這裡的 self 指某個實例物件自己... def __init__(self, name): # name 是實例的屬性... self.name = name # live 是類的屬性 live = True

這裡的 Person 就是自訂類, 類是一個抽象的模版, 既不是指張三也不是李四等具體的人, 現在我們可以通過調用這個類來構造(產生實體)出一個具體的, 實在的, 有名字的物件出來, 這個物件稱之為實例物件(Instance)。

>>> p1 = Person("zhangsan")>>> p1.name'zhangsan'>>>>>> p2 = Person("lisi")>>> p2.name'lisi'

這裡的 p1、p2 就是產生實體之後的(實例, instance)物件, 這兩個物件的類型都是 Person 類, 類與(實例)物件的關係就像一個車輛模具與一輛被造出來的真實車的關係一樣。

>>> p1<__main__.Person object at 0x0195AA30>>>> type(p1) # 這裡的__main__是模組名稱

類也是物件(又叫類物件)

剛剛我們說了一切都是物件, 實例(真實的車)是物件, 類(模具車)當然也是物件, 因為它也是實實在在存在的東西。

當 Python 解譯器執行到關鍵字 class 這個指令的時候, 在內部就會創建一個名為 “Person” 的類, 這個類也是個物件, 我們稱之為類物件(注意區別實例物件), 它一樣有ID標識、有類型、有值。 例如:

>>> id(Person)26564024>>> type(Person)>>> Person

我們注意到這個 Person 這個類物件的類型叫 “type”, 也就是說 Person 類是由 type 創建出來的, 現在你要記住, p1, p2 是實例物件, 而 Person 是類物件。 另外, 這個 type 是什麼鬼?

我們來回顧一下, 實例物件 p1 的類型是類物件 Person, Person 的類型 type

>>> nums = [1,2,3]>>> type(nums)>>> type(list)

nums 的類型是 list, list 的類型也是 type, 字典類(dict)的類型也是 type, 所有類的類型都是 type, 也就是說所有的類都是由type 創建的。 這個 type 就是元類(metaclass), 元類是用於創建類的類, 道生一,

一生二, 三生萬物, 元類就是 Python 中的造物主。 (元類自己也是物件)

現在我們都知道類(物件)可以使用 class 關鍵字創建, 我們還知道類(物件)的類型是 type, 既然知道了它的類型是 type, 那麼肯定可以通過 type(元類)來創建。

用元類創建類

前面講到過, type 有一個作用是用於檢查物件的類型, 其實它還有另外一個作用就是作為元類動態地創建類(物件)。

>>> Person = type("Person", (), {"live":True})>>> Person

Person 就是一個類, 它等價於:

>>> class Person:... live = True...>>> Person

用元類 type 創建類的語法是:

type(類名,父類元組(可以為空), 屬性字典)

那麼元類到底有什麼用處呢?我們真的需要元類嗎?請關注下回講解, (留給大家多些時間消化, O(∩_∩)O)

小結

Python中一切皆為物件, 類是物件, 元類也是物件, 元類是用於創建類的類。

End.

運行人員:中國統計網小編

中國統計網, 是國內最早的大資料學習網站

//www.itongji.cn

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示