day24-1 元类
目錄
- 元類(lèi)
- 類(lèi)的組成
- 內(nèi)置函數(shù) exec()
- class關(guān)鍵字創(chuàng)建類(lèi)原理
- 自定義元類(lèi)控制類(lèi)的創(chuàng)建
- 自定義元類(lèi)控制類(lèi)實(shí)例化
- 自定義元類(lèi)后對(duì)象屬性查找順序
元類(lèi)
在python中一切皆對(duì)象,name我們用class關(guān)鍵字定義的類(lèi)本身也是一個(gè)對(duì)象,負(fù)責(zé)產(chǎn)生該對(duì)象的類(lèi)稱(chēng)之為元類(lèi),即元類(lèi)可以簡(jiǎn)稱(chēng)為類(lèi)的類(lèi)
元類(lèi)是負(fù)責(zé)產(chǎn)生類(lèi)的,所以我們學(xué)習(xí)元類(lèi)或者定義元類(lèi)的目的是:為了控制類(lèi)的產(chǎn)生過(guò)程,還可以控制對(duì)象的產(chǎn)生過(guò)程
類(lèi)的組成
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)鍵字定義類(lèi)時(shí),在定義階段會(huì)執(zhí)行類(lèi)體中的代碼,創(chuàng)建名稱(chēng)空間,所以類(lèi)由三部分組成
- 類(lèi)名class_name:People
- 基類(lèi)class_bases:(object,)
- 類(lèi)的名稱(chēng)空間class_dic
內(nèi)置函數(shù) exec()
將字符串中的代碼執(zhí)行,然后把產(chǎn)生的全局名稱(chēng)丟入到global_space字典中,局部名稱(chēng)丟入到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)建類(lèi)原理
用class關(guān)鍵字創(chuàng)建一個(gè)類(lèi),用的默認(rèn)的元類(lèi)type
class_name = 'P' # 類(lèi)名 class_bases = (object,) # 基類(lèi) 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 # 類(lèi)的名稱(chēng)空間P= type(class_name, class_bases, class_dic) print(P) <class '__main__.P'>自定義元類(lèi)控制類(lèi)的創(chuàng)建
- 控制創(chuàng)建類(lèi)時(shí)必須寫(xiě)說(shuō)明,沒(méi)寫(xiě)就拋出異常
- 控制創(chuàng)建類(lèi)時(shí)類(lèi)名不能全為小寫(xiě),類(lèi)名全為小寫(xiě)則拋出異常
自定義元類(lèi)控制類(lèi)實(shí)例化
類(lèi)的實(shí)例化就是元類(lèi)的調(diào)用,類(lèi)實(shí)例化原理:
- 先造出一個(gè)空對(duì)象
- 為該空對(duì)象初始化獨(dú)有的屬性
- 返回一個(gè)初始化好的對(duì)象
自定義元類(lèi)后對(duì)象屬性查找順序
對(duì)象本身-->類(lèi)-->父類(lèi)-->父類(lèi)-->object-->type找不到報(bào)錯(cuò)
轉(zhuǎn)載于:https://www.cnblogs.com/863652104kai/p/11083661.html
總結(jié)
以上是生活随笔為你收集整理的day24-1 元类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: gzip, gunzip, zcat -
- 下一篇: eclipse修改项目访问前缀