day24-1 元类
生活随笔
收集整理的這篇文章主要介紹了
day24-1 元类
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
目錄
- 元類
- 類的組成
- 內(nèi)置函數(shù) exec()
- class關(guān)鍵字創(chuàng)建類原理
- 自定義元類控制類的創(chuàng)建
- 自定義元類控制類實例化
- 自定義元類后對象屬性查找順序
元類
在python中一切皆對象,name我們用class關(guān)鍵字定義的類本身也是一個對象,負(fù)責(zé)產(chǎn)生該對象的類稱之為元類,即元類可以簡稱為類的類
元類是負(fù)責(zé)產(chǎn)生類的,所以我們學(xué)習(xí)元類或者定義元類的目的是:為了控制類的產(chǎn)生過程,還可以控制對象的產(chǎn)生過程
類的組成
class People(object):x = 1print('from people')def __init__(self, name, age):self.name = nameself.age = agedef speak(self):print('from speak')在用class關(guān)鍵字定義類時,在定義階段會執(zhí)行類體中的代碼,創(chuàng)建名稱空間,所以類由三部分組成
- 類名class_name:People
- 基類class_bases:(object,)
- 類的名稱空間class_dic
內(nèi)置函數(shù) exec()
將字符串中的代碼執(zhí)行,然后把產(chǎn)生的全局名稱丟入到global_space字典中,局部名稱丟入到local_space字典中
cmd = """ x = 1 global y y = 10 def __init__(self, name, age):self.name = nameself.age = agedef speak(self):print('from speak') """ global_space = {} local_space = {} exec(cmd,global_space,local_space) # 未聲明gloabal的變量全是局部變量 print('local:',local_space) local: {'x': 1, '__init__': <function __init__ at 0x000002C2319EB158>, 'speak': <function speak at 0x000002C2319EB0D0>}class關(guān)鍵字創(chuàng)建類原理
用class關(guān)鍵字創(chuàng)建一個類,用的默認(rèn)的元類type
class_name = 'P' # 類名 class_bases = (object,) # 基類 cmd = """ x = 1 global y y = 10 def __init__(self, name, age):self.name = nameself.age = agedef speak(self):print('from speak') """ global_space = {} local_space = {} exec(cmd,global_space,local_space) class_dic = local_space # 類的名稱空間P= type(class_name, class_bases, class_dic) print(P) <class '__main__.P'>自定義元類控制類的創(chuàng)建
- 控制創(chuàng)建類時必須寫說明,沒寫就拋出異常
- 控制創(chuàng)建類時類名不能全為小寫,類名全為小寫則拋出異常
自定義元類控制類實例化
類的實例化就是元類的調(diào)用,類實例化原理:
- 先造出一個空對象
- 為該空對象初始化獨有的屬性
- 返回一個初始化好的對象
自定義元類后對象屬性查找順序
對象本身-->類-->父類-->父類-->object-->type找不到報錯
轉(zhuǎn)載于:https://www.cnblogs.com/863652104kai/p/11083661.html
總結(jié)
以上是生活随笔為你收集整理的day24-1 元类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gzip, gunzip, zcat -
- 下一篇: eclipse修改项目访问前缀