python元类的简单了解
一、什么是元類?
在python中一切皆對(duì)象,那么類是否也是對(duì)象呢?通過class關(guān)鍵字產(chǎn)生的類的實(shí)例,我們已經(jīng)很熟悉了,但是通過class關(guān)鍵字產(chǎn)生的類的類就是元類。
class Bar:passb1 = Bar() print(type(b1)) #<class '__main__.Bar'>print(type(Bar)) #<class 'type'>可以看到b1對(duì)象是由類Bar產(chǎn)生的,而Bar類是由type這個(gè)元類產(chǎn)生的,type是python中的一個(gè)內(nèi)建元類。
那么,使用class創(chuàng)建類時(shí)必然調(diào)用type元類,Bar=type(…),在type中也必定傳入一些和類相關(guān)的參數(shù),這就涉及類的組成部分了。
類由三部分組成:
- 類名 class_name=‘Bar’
- 基類們 class_bases=(object,)
- 類的名稱空間 class_dict,類的名稱空間是執(zhí)行類體代碼而得到的
調(diào)用type時(shí)會(huì)依次傳入以上三個(gè)參數(shù),通過type創(chuàng)建Bar類的過程大致就是:
(1)拿到類名 class_name=‘Bar’
(2)拿到類的基類們 class_bases=(object,)
(3)執(zhí)行類體代碼拿到類的名稱空間 class_dict
(4)調(diào)用元類得到Bar類,Bar = type(class_name,class_bases,class_dict)
二、自定義元類
像上面Bar沒有聲明自己的元類,那么默認(rèn)它的元類就是type,除了內(nèi)建type元類外,還可以通過繼承type元類,然后使用metaclass關(guān)鍵字參數(shù)為一個(gè)類指定元類。
(一)通過type元類實(shí)現(xiàn)類的創(chuàng)建
通過上述Bar類的創(chuàng)建過程知曉type元類中傳入三個(gè)參數(shù):
- Bar 表示需要?jiǎng)?chuàng)建的類的類名
- (object,) 表示基類們
- {} 一個(gè)字典,表示這個(gè)類中含有的屬性和方法
上面使用的就是基于最基本的內(nèi)建元類type創(chuàng)建類,這與下面的直接使用class關(guān)鍵字創(chuàng)建的結(jié)果是相同的。
''' 遇到問題沒人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書! ''' class Bar:# 屬性name = 'Bright'# 方法def hobby(self):print('write code!')#將Bar類實(shí)例化 b1 = Bar() #測試 print(b1.name) #Bright print(b1.hobby) #<bound method Bar.hobby of <__main__.Bar object at 0x0000000000626898>>(二)自定義元類
在自定義元類中使用到一個(gè)__call__方法,它是在對(duì)象后面加括號(hào)時(shí)調(diào)用,元類產(chǎn)生的對(duì)象就是我們常說的使用class創(chuàng)建的類,所以普通類的實(shí)例就相當(dāng)于元類對(duì)象加括號(hào)。例如:
b1 = Bar()b1是Bar類的實(shí)例,Bar是元類的實(shí)例,所以Bar()就默認(rèn)執(zhí)行了元類中的__call__方法。顯然在__call__方法中就需要完成這么幾件事:
- 調(diào)用__new__方法創(chuàng)建一個(gè)空對(duì)象(就是b1)
- 調(diào)用__init__方法初始化空對(duì)象
- 返回初始化好的對(duì)象
總結(jié)
以上是生活随笔為你收集整理的python元类的简单了解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中创建对象的七种方式
- 下一篇: Python小练习:批量删除多个文件夹内