python元類是什么及怎么用

這篇文章主要介紹了python元類是什么及怎么用的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇python元類是什么及怎么用文章都會(huì)有所收獲,下面我們一起來看看吧。

創(chuàng)新互聯(lián)專注于民勤網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供民勤營銷型網(wǎng)站建設(shè),民勤網(wǎng)站制作、民勤網(wǎng)頁設(shè)計(jì)、民勤網(wǎng)站官網(wǎng)定制、小程序開發(fā)服務(wù),打造民勤網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供民勤網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

python中的類也是一個(gè)對象,可以說是類對象,可以由 type()來創(chuàng)建類對象的。有了這個(gè)知識(shí)我們先看看下面這個(gè)函數(shù):

python元類是什么及怎么用

這個(gè)可以根據(jù)我們傳遞的參數(shù)來指定生成相關(guān)的對象,可以說是很簡單地動(dòng)態(tài)創(chuàng)建類,我們再看看結(jié)果:

python元類是什么及怎么用

這里輸入的參數(shù)為 user,所以最好的結(jié)果就是生成了 User這個(gè)類,這個(gè)方法雖然是簡單,但是當(dāng)里面類的邏輯越來越多的時(shí)候這個(gè)類里寫的代碼就會(huì)非常地多,就會(huì)變得很臃腫了,不好看,所以這種方法不合適。

我們再看看 type() 這個(gè)方法,之前說它可以動(dòng)態(tài)創(chuàng)建一個(gè)類,那我們現(xiàn)在看看到底怎樣創(chuàng)建?

在pycharm編輯器上,進(jìn)入 type() 的內(nèi)部源碼查看,可以看到:

python元類是什么及怎么用

第三行說的就是創(chuàng)建一個(gè)新類,接收的是三個(gè)參數(shù),通過名字很容易就知道這三個(gè)參數(shù)的意義:

  • name:類的名稱

  • bases:基類,就是所需要繼承的類

  • dict:類的屬性,包括方法

那既然知道了就創(chuàng)建一個(gè)來看看。

python元類是什么及怎么用

這個(gè)可以看到我創(chuàng)建了一個(gè) person 的類,沒有基類,注意基類這個(gè)接收的是一個(gè)元組,屬性只有一個(gè) name 屬性。這個(gè)是不是很簡單很直接,如果需要增加方法,也只是在 dict 參數(shù)加上對應(yīng)的方法名即可,如下:

python元類是什么及怎么用

我們知道能創(chuàng)建類的類就是元類,所以說 type也是一個(gè)元類。這個(gè)還比較簡單,因?yàn)榫腿齻€(gè)參數(shù),按照規(guī)則來就可以了,但是這個(gè)只能是動(dòng)態(tài)生成類,不能對類的生成過程做操作,也就是說不能控制類是如何生成的,所以在 python3 中還有個(gè)元類:metaclass,這個(gè)也是可以動(dòng)態(tài)創(chuàng)建類的,比 type這個(gè)方法能操作的東西多了,但同時(shí)也有點(diǎn)難。

在說metaclass之前,先說下類是如何生成的,類分兩種。

  1. 普通的類,不通過 metaclass 來創(chuàng)建的,這個(gè)就簡單,就是通過type來創(chuàng)建類對象。

  2. 第二種,就是使用 metaclass 的,這時(shí)就通過 metaclass 來創(chuàng)建類,如果此類沒有,就會(huì)去尋找父類的 metaclass ,再?zèng)]有,還是會(huì)繼續(xù)往上找,直至找到。

再說下為什么要使用 metaclass 來創(chuàng)建類呢?

  • 將創(chuàng)建類對象的過程委托給元類來做,不需要再在類內(nèi)部來操作,這樣代碼的分離性比較強(qiáng)

  • 可以檢查該類有沒有實(shí)現(xiàn)父類的那些抽象方法,沒有重載的話就可以直接拋異常,不讓創(chuàng)建成功

還有很多,以后見到再補(bǔ)充說明,還有就是你會(huì)見到很多框架都會(huì)使用metaclass來創(chuàng)建類的,要想成為一名好的 python 工程師,元類這一關(guān)必須過的。

說了,那么多,舉個(gè)小栗子來說明怎么使用 metaclass 來創(chuàng)建類吧!

python元類是什么及怎么用

可以看到,在類中指明 metaclass 來控制類的生成,這時(shí)所指向 metaclass 必須繼承t ype 這個(gè)類才可以。我們還在 metaclass 這個(gè)類中通過修改__new__這個(gè)方法來控制類的實(shí)現(xiàn),這時(shí)就可以將__init__和__new__這兩個(gè)方法分離出來了。

有廣告才有更好輸出

下面再來通過實(shí)現(xiàn)一個(gè) orm 框架類體現(xiàn)通過元類創(chuàng)建類的好處。因?yàn)榇蠹叶贾涝趐ython中使用 pyMySQL 這個(gè)庫來操作 mysql 是很煩,所以才會(huì)有了這個(gè) orm 框架,這里引用下廖雪峰的官網(wǎng)的一段話:

ORM全稱“Object Relational Mapping”,即對象-關(guān)系映射,就是把關(guān)系數(shù)據(jù)庫的一行映射為一個(gè)對象,也就是一個(gè)類對應(yīng)一個(gè)表,這樣,寫代碼更簡單,不用直接操作SQL語句。

要編寫一個(gè)ORM框架,所有的類都只能動(dòng)態(tài)定義,因?yàn)橹挥惺褂谜卟拍芨鶕?jù)表的結(jié)構(gòu)定義出對應(yīng)的類來。

talk is cheap show you the code.

python元類是什么及怎么用

這個(gè)是我們在使用 orm 框架時(shí)希望是上面這樣調(diào)用的,這里就簡單定義兩個(gè)字段 name 和 age,User 類中還有個(gè)內(nèi)部類是 Meta ,這里面用了定義數(shù)據(jù)表的其他屬性,與字段定義分開,所以里面定義了一個(gè)數(shù)據(jù)表名稱。在使用 save() 方法保存的時(shí)候就是內(nèi)部拼接 mysql 語句,等下實(shí)現(xiàn)。

接下來先對兩個(gè)字段類實(shí)現(xiàn)。

python元類是什么及怎么用

python元類是什么及怎么用

這個(gè)是對 IntField 類的實(shí)現(xiàn),可以看到里面很多邏輯,同時(shí) CharField 這個(gè)類也是這樣實(shí)現(xiàn)的。

python元類是什么及怎么用

接下來是對 metaclass 的實(shí)現(xiàn)

python元類是什么及怎么用

這個(gè)__new__的方法就是對類的生成的控制,我們可以斷點(diǎn)看看,里面的參數(shù)是什么

python元類是什么及怎么用

可以看到,經(jīng)過拆包,args可以分為三個(gè)參數(shù),一個(gè)類名稱,另一個(gè)為元組,就是基類,還有一個(gè)就是類的屬性,所以可以把上面的參數(shù)改為下面的更好操作。

python元類是什么及怎么用

下面我們需要對attrs的參數(shù)里的字段進(jìn)行抽取出來,但是在判斷的時(shí)候需要判斷的東西很多,比如需要判斷是 CharField 或者 IntField 才進(jìn)行抽取,這樣如果字段多了的話寫的代碼就會(huì)很多,有一個(gè)技巧就是讓所有的字段都共同繼承一個(gè)基類 Field,然后判斷是不是這個(gè)基類即可。

python元類是什么及怎么用

這個(gè)元類基本上是完成了,最后記得調(diào)用父類的__new__進(jìn)行返回,要不然會(huì)創(chuàng)建類對象失敗,從而調(diào)用不了__init__方法來實(shí)例對象。

這里還有一個(gè)問題,就是用戶在創(chuàng)建 User 時(shí)候可能會(huì)直接存入字段信息,就比如下面這個(gè):

user = User('張三', 23)

所以我們還需要在 User 類中實(shí)現(xiàn) __init__ 方法,但是如果直接在 User 類中添加這個(gè)方法的話就不太好看了,我們可以再實(shí)現(xiàn)一個(gè)基類 BaseModel ,在這個(gè)類中添加 __init__ 方法,這樣就比較好,而且還可以實(shí)現(xiàn) save() 這個(gè)方法。

在使用了另一個(gè)基類 BaseModel 之后,將這個(gè)基類來用 metaclass 來實(shí)現(xiàn),同時(shí) User 就不需要實(shí)現(xiàn) metaclass 了,只需要繼承此基類就好,因?yàn)?meta class 會(huì)向上查找,只需要父類實(shí)現(xiàn)就可以了。同時(shí),在元類 Model中,我們還需要加上一個(gè)判斷,只有在 User 這個(gè)類創(chuàng)建時(shí)才需要控制其類的生成,其他的就不需要了。

python元類是什么及怎么用

python元類是什么及怎么用

這時(shí)再看看基類 BaseModel 的 __init__ 方法如何實(shí)現(xiàn)的。

python元類是什么及怎么用

通過 setattr() 方法來進(jìn)行賦值就簡單多了,不需要一個(gè)一個(gè)判斷完再取出來。

剩下的就只有 save 方法沒有實(shí)現(xiàn)了,這個(gè)方法就簡單多了,只需要實(shí)現(xiàn)拼接 mysql 語句就可以了,這里需要拼接的語句是

sql = 'insert user(name, age) values ("", 23)'

再看看代碼實(shí)現(xiàn)

python元類是什么及怎么用

以上就是整個(gè) orm框架的實(shí)現(xiàn)了,是不是看起來很簡單?卻解決了 繁雜的 mysql 操作語句。

最后運(yùn)行下就會(huì)看到一個(gè)完整的 mysql 語句出現(xiàn)。

python元類是什么及怎么用

如果我們在需要添加別的類型字段的話就只需要實(shí)現(xiàn)下這個(gè)類就好,其他的都不需要管了,是不是超級(jí)方便的?

關(guān)于“python元類是什么及怎么用”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“python元類是什么及怎么用”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

分享名稱:python元類是什么及怎么用
新聞來源:http://bm7419.com/article26/iihicg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、定制開發(fā)、品牌網(wǎng)站建設(shè)移動(dòng)網(wǎng)站建設(shè)、服務(wù)器托管小程序開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司