龜叔發明了 Python,而後集成了一堆概念在這門語言裏面,好比:迭代器,裝飾器,函數,生成器,類,對象,協程等等。python
這些概念對初學者彷佛沒一個好懂的,不過還有比這更難的概念,它是 Python 世界中的造物主,雖然咱們不多去直接使用它,但每天都在用,它就是今天的主角------元類。bash
今天個人任務就是完全明白什麼是元類,看懂了別忘了給我點個贊,分享給更多人。函數
要搞懂元類,咱們仍是先從對象提及。ui
Python 一切皆對象,這句話你必定有據說過(如今你就據說了),一個數字是對象,一個字符串是對象,一個列表是對象,一個字典是對象,例如:spa
>>> i = 10
>>> s = "abc"
>>> nums = [1,2,3]
>>> dicts = {"name":"zhang"}
複製代碼
等號右邊是對象,左邊是給這些對象取的名字,任何對象都有3個關鍵屬性:標識、值、類型。.net
標識就和人的身份證ID同樣,每一個對象有惟一ID標識,在整個生命週期中都不會變,你能夠認爲標識是這個對象在計算機內存中的地址。經過函數 id()
能夠查看對象的ID標識。code
>>> id(i)
40592592
>>> id(s)
44980584
複製代碼
對象的第二個屬性是值,值很好理解,好比 i 的值是 10,s 的值是 abc,nums 的值就是 1,2,3。cdn
對象還有一個很重要的屬性就是類型,任何對象都有屬於本身的類型,對象就是由它的類型構造出來的,好比上面的 i 的類型是 int 類型,這個對象就是由 int 構造出來的。s 類型是字符串類型,nums 的類型是列表類型,dicts 的類型是字典類型,它們都是由對應的類型構建出來的。協程
經過 type()
能夠查看對象的類型。對象
>>> type(i)
<class 'int'>
>>> type(s)
<class 'str'>
>>> type(nums)
<class 'list'>
>>> type(dicts)
<class 'dict'>
複製代碼
對象的類型也和ID標識同樣,肯定好以後就不會再變化了。
除了系統已經定義好了的整數類型,字符串類型,列表等類型以外,咱們還能夠建立本身的類型,用關鍵字 class
來定義。例如:
>>> class Person:
# 這裏的 self 指某個實例對象本身
... def __init__(self, name):
# name 是實例的屬性
... self.name = name
# live 是類的屬性
live = True
複製代碼
這裏的 Person 就是自定義類,類是一個抽象的模版,既不指張三也不是李四,如今咱們能夠經過調用這個類來構造(實例化)出一個具體的,實在的,有名字的對象出來,這個對象稱之爲實例對象。
>>> p1 = Person("zhangsan")
>>> p1.name
'zhangsan'
>>>
>>> p2 = Person("lisi")
>>> p2.name
'lisi'
複製代碼
這裏的 p一、p2 就是實例化以後的(實例)對象,這兩個對象的類型都是 Person 類,類與(實例)對象的關係就像一個車輛模具與一輛被造出來的真實車的關係同樣。
>>> p1
<__main__.Person object at 0x0195AA30>
>>> type(p1)
<class '__main__.Person'> # 這裏的__main__是模塊名稱
複製代碼
剛剛咱們說了一切都是對象,實例(真實車)是對象,類(模具)固然也是對象,由於它也是個實實在在存在的東西,
當 Python 解釋器執行到關鍵字 class
這個指令的時候,在內部就會建立一個名爲 "Person" 的類,這個類也是個對象,咱們稱之爲類對象(注意區別實例對象),它同樣有ID標識、有類型、有值。例如:
>>> id(Person)
26564024
>>> type(Person)
<class 'type'>
>>> Person
<class '__main__.Person'>
複製代碼
咱們注意到這個 Person 這個類對象的類型叫 「type」,也就是說 Person 類是由 type 建立出來的,如今你要記住,p1,p2 是實例對象,而 Person 是類對象。另外,這個 type 是什麼鬼?
咱們來回顧一下,實例對象 p1 的類型是類對象 Person,Person 的類型 type
>>> nums = [1,2,3]
>>> type(nums)
<class 'list'>
>>> type(list)
<class 'type'>
複製代碼
nums 的類型是 list,list 的類型也是 type,字典類(dict)的類型也是 type,全部類的類型都是 type,也就是說全部的類都是由type 建立的。這個 type 就是元類,道生一,一輩子二,三生萬物,元類就是 Python 中的造物主。(元類本身也是對象)
如今咱們都知道類(對象)能夠使用 class
關鍵字建立,咱們還知道類(對象)的類型是 type,既然知道了它的類型是 type,那麼確定能夠經過 type(元類)來建立。
前面講到過,type
有一個做用是用於檢查對象的類型,其實它還有另一個做用就是做爲元類動態地建立類(對象)。
>>> Person = type("Person", (), {"live":True})
>>> Person
<class '__main__.Person'>
複製代碼
Person 就是一個類,它等價於:
>>> class Person:
... live = True
...
>>> Person
<class '__main__.Person'>
複製代碼
用元類 type
建立類的語法是:
type(類名,基類元組(能夠爲空), 屬性字典)
複製代碼
那麼元類到底有什麼用處呢?咱們真的須要元類嗎?請關注下回講解,(留給你們多些時間消化,O(∩_∩)O)
博客: foofish.net
公衆號:Python之禪