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