python的metaclass關(guān)鍵字詳解
metaclass其實(shí)就是最常用的元類(lèi),也就是:創(chuàng)建類(lèi)的類(lèi)
1 作用
元類(lèi)一般用來(lái):
- 驗(yàn)證與約束 在類(lèi)創(chuàng)建時(shí)檢查它是否符合特定的規(guī)范。例如:強(qiáng)制子類(lèi)必須擁有某個(gè)屬性,或者方法名必須以某種格式命名。
- 動(dòng)態(tài)修改類(lèi) 在類(lèi)正式生成之前,動(dòng)態(tài)地為類(lèi)增加方法、修改屬性名、或者改變繼承關(guān)系。
- 自動(dòng)注冊(cè) 在框架開(kāi)發(fā)中,元類(lèi)常用來(lái)自動(dòng)記錄哪些類(lèi)繼承了基類(lèi)。例如插件系統(tǒng)中,只要你定義一個(gè)類(lèi),元類(lèi)就會(huì)自動(dòng)把它加入到已激活的插件列表中。
- 實(shí)現(xiàn)特定領(lǐng)域的DSL 比如django的orm或pydantic的模型
2 代碼示例:強(qiáng)制屬性大寫(xiě)
假設(shè)要實(shí)現(xiàn)一個(gè)功能:讓某個(gè)類(lèi)中定義的所有屬性名自動(dòng)變成大寫(xiě)
# 方式一:直接改字典
class UpperMeta(type):
"""把除 __xxx__ 以外的所有屬性名強(qiáng)制變成大寫(xiě)"""
def __new__(mcs, name, bases, namespace, **kw):
new_ns = {}
for k, v in namespace.items():
if k.startswith('__') and k.endswith('__'):
new_ns[k] = v # 魔法方法保持原樣
else:
new_ns[k.upper()] = v # 其余統(tǒng)一變大寫(xiě)
return super().__new__(mcs, name, bases, new_ns, **kw)
class Foo(metaclass=UpperMeta):
x = 1
y = 2
def hello(self):
return 'hello'
print(Foo.X) # 1
print(Foo.Y) # 2
print(Foo.HELLO()) # 'hello'
但是在,一般場(chǎng)景下,可以使用類(lèi)裝飾器來(lái)代替,因?yàn)樗雍?jiǎn)單,可以避開(kāi)元類(lèi)的復(fù)雜性。 http://m.dhdzp.com/python/358207z57.htm
到此這篇關(guān)于python的metaclass關(guān)鍵字詳解的文章就介紹到這了,更多相關(guān)python metaclass關(guān)鍵字內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)輸入任意一個(gè)大寫(xiě)字母生成金字塔的示例
這篇文章主要介紹了python實(shí)現(xiàn)輸入任意一個(gè)大寫(xiě)字母生成金字塔的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
Python代理抓取并驗(yàn)證使用多線程實(shí)現(xiàn)
這里沒(méi)有使用隊(duì)列只是采用多線程分發(fā)對(duì)代理量不大的網(wǎng)頁(yè)還行但是幾百幾千性能就很差了,感興趣的朋友可以了解下,希望對(duì)你有所幫助2013-05-05
python時(shí)間序列數(shù)據(jù)轉(zhuǎn)為timestamp格式的方法
這篇文章主要介紹了python時(shí)間序列數(shù)據(jù)轉(zhuǎn)為timestamp格式的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
使用Matplotlib實(shí)現(xiàn)自定義坐標(biāo)軸字體及刻度樣式詳解
在數(shù)據(jù)可視化中,坐標(biāo)軸標(biāo)簽和刻度標(biāo)簽的呈現(xiàn)方式直接影響圖表的可讀性和美觀性,本文將詳細(xì)介紹如何設(shè)置坐標(biāo)軸標(biāo)題的字體樣式,希望對(duì)大家有所幫助2026-01-01
Python+matplotlib實(shí)現(xiàn)計(jì)算兩個(gè)信號(hào)的交叉譜密度實(shí)例
這篇文章主要介紹了Python+matplotlib實(shí)現(xiàn)計(jì)算兩個(gè)信號(hào)的交叉譜密度實(shí)例,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01

