Python 元類實(shí)例解析
龜叔發(fā)明了 Python,然后集成了一堆概念在這門語(yǔ)言里面,比如:迭代器,裝飾器,函數(shù),生成器,類,對(duì)象,協(xié)程等等。
這些概念對(duì)初學(xué)者似乎沒(méi)一個(gè)好懂的,不過(guò)還有比這更難的概念,它是 Python 世界中的造物主,雖然我們很少去直接使用它,但天天都在用,它就是今天的主角------元類。
今天我的任務(wù)就是徹底明白什么是元類,一起看看。
要搞懂元類,我們還是先從對(duì)象說(shuō)起。
對(duì)象(Object)
Python 一切皆對(duì)象,這句話你一定有聽(tīng)說(shuō)過(guò)(現(xiàn)在你就聽(tīng)說(shuō)了),一個(gè)數(shù)字是對(duì)象,一個(gè)字符串是對(duì)象,一個(gè)列表是對(duì)象,一個(gè)字典是對(duì)象,例如:
>>> i = 10 >>> s = "abc" >>> nums = [1,2,3] >>> dicts = {"name":"zhang"}
等號(hào)右邊是對(duì)象,左邊是給這些對(duì)象取的名字,任何對(duì)象都有3個(gè)關(guān)鍵屬性:標(biāo)識(shí)、值、類型。
標(biāo)識(shí)
標(biāo)識(shí)就和人的身份證ID一樣,每個(gè)對(duì)象有唯一ID標(biāo)識(shí),在整個(gè)生命周期中都不會(huì)變,你可以認(rèn)為標(biāo)識(shí)是這個(gè)對(duì)象在計(jì)算機(jī)內(nèi)存中的地址。通過(guò)函數(shù) id() 可以查看對(duì)象的ID標(biāo)識(shí)。
>>> id(i) 40592592 >>> id(s) 44980584
對(duì)象值
對(duì)象的第二個(gè)屬性是值,值很好理解,比如 i 的值是 10,s 的值是 abc,nums 的值就是 1,2,3。
類型
對(duì)象還有一個(gè)很重要的屬性就是類型,任何對(duì)象都有屬于自己的類型,對(duì)象就是由它的類型構(gòu)造出來(lái)的,比如上面的 i 的類型是 int 類型,這個(gè)對(duì)象就是由 int 構(gòu)造出來(lái)的。s 類型是字符串類型,nums 的類型是列表類型,dicts 的類型是字典類型,它們都是由對(duì)應(yīng)的類型構(gòu)建出來(lái)的。
通過(guò) type() 可以查看對(duì)象的類型。
>>> type(i) <class 'int'> >>> type(s) <class 'str'> >>> type(nums) <class 'list'> >>> type(dicts) <class 'dict'>
對(duì)象的類型也和ID標(biāo)識(shí)一樣,確定好之后就不會(huì)再變化了。
類與(實(shí)例)對(duì)象
除了系統(tǒng)已經(jīng)定義好了的整數(shù)類型,字符串類型,列表等類型之外,我們還可以創(chuàng)建自己的類型,用關(guān)鍵字 class 來(lái)定義。例如:
>>> class Person: # 這里的 self 指某個(gè)實(shí)例對(duì)象自己 ... def __init__(self, name): # name 是實(shí)例的屬性 ... self.name = name # live 是類的屬性 live = True
這里的 Person 就是自定義類,類是一個(gè)抽象的模版,既不指張三也不是李四,現(xiàn)在我們可以通過(guò)調(diào)用這個(gè)類來(lái)構(gòu)造(實(shí)例化)出一個(gè)具體的,實(shí)在的,有名字的對(duì)象出來(lái),這個(gè)對(duì)象稱之為實(shí)例對(duì)象。
>>> p1 = Person("zhangsan") >>> p1.name 'zhangsan' >>> >>> p2 = Person("lisi") >>> p2.name 'lisi'
這里的 p1、p2 就是實(shí)例化之后的(實(shí)例)對(duì)象,這兩個(gè)對(duì)象的類型都是 Person 類,類與(實(shí)例)對(duì)象的關(guān)系就像一個(gè)車輛模具與一輛被造出來(lái)的真實(shí)車的關(guān)系一樣。
>>> p1 <__main__.Person object at 0x0195AA30> >>> type(p1) <class '__main__.Person'> # 這里的__main__是模塊名稱
類也是對(duì)象(又叫類對(duì)象)
剛剛我們說(shuō)了一切都是對(duì)象,實(shí)例(真實(shí)車)是對(duì)象,類(模具)當(dāng)然也是對(duì)象,因?yàn)樗彩莻€(gè)實(shí)實(shí)在在存在的東西,
當(dāng) Python 解釋器執(zhí)行到關(guān)鍵字 class 這個(gè)指令的時(shí)候,在內(nèi)部就會(huì)創(chuàng)建一個(gè)名為 "Person" 的類,這個(gè)類也是個(gè)對(duì)象,我們稱之為類對(duì)象(注意區(qū)別實(shí)例對(duì)象),它一樣有ID標(biāo)識(shí)、有類型、有值。例如:
>>> id(Person) 26564024 >>> type(Person) <class 'type'> >>> Person <class '__main__.Person'>
我們注意到這個(gè) Person 這個(gè)類對(duì)象的類型叫 “type”,也就是說(shuō) Person 類是由 type 創(chuàng)建出來(lái)的,現(xiàn)在你要記住,p1,p2 是實(shí)例對(duì)象,而 Person 是類對(duì)象。另外,這個(gè) type 是什么鬼?
我們來(lái)回顧一下,實(shí)例對(duì)象 p1 的類型是類對(duì)象 Person,Person 的類型 type
>>> nums = [1,2,3] >>> type(nums) <class 'list'> >>> type(list) <class 'type'>
nums 的類型是 list,list 的類型也是 type,字典類(dict)的類型也是 type,所有類的類型都是 type,也就是說(shuō)所有的類都是由type 創(chuàng)建的。這個(gè) type 就是元類,道生一,一生二,三生萬(wàn)物,元類就是 Python 中的造物主。(元類自己也是對(duì)象)
現(xiàn)在我們都知道類(對(duì)象)可以使用 class 關(guān)鍵字創(chuàng)建,我們還知道類(對(duì)象)的類型是 type,既然知道了它的類型是 type,那么肯定可以通過(guò) type(元類)來(lái)創(chuàng)建。
用元類創(chuàng)建類
前面講到過(guò),type 有一個(gè)作用是用于檢查對(duì)象的類型,其實(shí)它還有另外一個(gè)作用就是作為元類動(dòng)態(tài)地創(chuàng)建類(對(duì)象)。
>>> Person = type("Person", (), {"live":True}) >>> Person <class '__main__.Person'>
Person 就是一個(gè)類,它等價(jià)于:
>>> class Person: ... live = True ... >>> Person <class '__main__.Person'>
用元類 type 創(chuàng)建類的語(yǔ)法是:
type(類名,基類元組(可以為空), 屬性字典)
總結(jié)
以上所述是小編給大家介紹的 Python 元類實(shí)例解析,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
scrapy處理python爬蟲(chóng)調(diào)度詳解
在本篇文章里小編給大家整理的是一篇關(guān)于scrapy處理python爬蟲(chóng)調(diào)度的相關(guān)內(nèi)容,有興趣的朋友們學(xué)習(xí)下。2020-11-11Python實(shí)現(xiàn)輕松防止屏幕截圖的技巧分享
屏幕截圖是一種常見(jiàn)的用于記錄信息或者監(jiān)控用戶活動(dòng)的方法,為了保護(hù)隱私和數(shù)據(jù)安全,可以通過(guò)使用Python編寫一些防護(hù)措施來(lái)防止他人截取我們的屏幕,下面我們就來(lái)學(xué)習(xí)一下有哪些具體操作吧2023-12-12python 判斷網(wǎng)絡(luò)連通的實(shí)現(xiàn)方法
下面小編就為大家分享一篇python 判斷網(wǎng)絡(luò)連通的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04手把手教你pip配置國(guó)內(nèi)鏡像源(最新詳盡版)
pip是一個(gè)現(xiàn)代的,通用的Python包管理工具,提供了對(duì)Python包的查找、下載、安裝、卸載的功能,下面這篇文章主要給大家介紹了關(guān)于pip配置國(guó)內(nèi)鏡像源的相關(guān)資料,需要的朋友可以參考下2023-02-02python爬蟲(chóng)解決驗(yàn)證碼的思路及示例
這篇文章主要介紹了python爬蟲(chóng)解決驗(yàn)證碼的思路及示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Jupyter notebook如何實(shí)現(xiàn)打開(kāi)數(shù)據(jù)集
這篇文章主要介紹了Jupyter notebook如何實(shí)現(xiàn)打開(kāi)數(shù)據(jù)集問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01