真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

python元類是什么及怎么用

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

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

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

python元類是什么及怎么用

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

python元類是什么及怎么用

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

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

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

python元類是什么及怎么用

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

  • name:類的名稱

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

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

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

python元類是什么及怎么用

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

python元類是什么及怎么用

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

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

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

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

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

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

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

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

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

python元類是什么及怎么用

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

有廣告才有更好輸出

下面再來通過實現(xiàn)一個 orm 框架類體現(xiàn)通過元類創(chuàng)建類的好處。因為大家都知道在python中使用 pyMySQL 這個庫來操作 mysql 是很煩,所以才會有了這個 orm 框架,這里引用下廖雪峰的官網(wǎng)的一段話:

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

要編寫一個ORM框架,所有的類都只能動態(tài)定義,因為只有使用者才能根據(jù)表的結(jié)構(gòu)定義出對應(yīng)的類來。

talk is cheap show you the code.

python元類是什么及怎么用

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

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

python元類是什么及怎么用

python元類是什么及怎么用

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

python元類是什么及怎么用

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

python元類是什么及怎么用

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

python元類是什么及怎么用

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

python元類是什么及怎么用

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

python元類是什么及怎么用

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

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

user = User('張三', 23)

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

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

python元類是什么及怎么用

python元類是什么及怎么用

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

python元類是什么及怎么用

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

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

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

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

python元類是什么及怎么用

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

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

python元類是什么及怎么用

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

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


當(dāng)前標(biāo)題:python元類是什么及怎么用
分享網(wǎng)址:http://weahome.cn/article/iihicg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部