python的metaclass關(guān)鍵字詳解
metaclass其實就是最常用的元類,也就是:創(chuàng)建類的類
1 作用
元類一般用來:
- 驗證與約束 在類創(chuàng)建時檢查它是否符合特定的規(guī)范。例如:強制子類必須擁有某個屬性,或者方法名必須以某種格式命名。
- 動態(tài)修改類 在類正式生成之前,動態(tài)地為類增加方法、修改屬性名、或者改變繼承關(guān)系。
- 自動注冊 在框架開發(fā)中,元類常用來自動記錄哪些類繼承了基類。例如插件系統(tǒng)中,只要你定義一個類,元類就會自動把它加入到已激活的插件列表中。
- 實現(xiàn)特定領(lǐng)域的DSL 比如django的orm或pydantic的模型
2 代碼示例:強制屬性大寫
假設(shè)要實現(xiàn)一個功能:讓某個類中定義的所有屬性名自動變成大寫
# 方式一:直接改字典
class UpperMeta(type):
"""把除 __xxx__ 以外的所有屬性名強制變成大寫"""
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)一變大寫
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'
但是在,一般場景下,可以使用類裝飾器來代替,因為它更加簡單,可以避開元類的復雜性。 http://m.fzitv.net/python/358207z57.htm
到此這篇關(guān)于python的metaclass關(guān)鍵字詳解的文章就介紹到這了,更多相關(guān)python metaclass關(guān)鍵字內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Pytorch中TensorDataset,DataLoader的聯(lián)合使用方式
這篇文章主要介紹了Pytorch中TensorDataset,DataLoader的聯(lián)合使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02
Python 查詢學生的平均分數(shù)的實現(xiàn)
這篇文章主要為大家詳細介紹了Python 查詢學生的平均分數(shù)的實現(xiàn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-04-04
Python連接到PostgreSQL數(shù)據(jù)庫的方法詳解
顧名思義,PostgreSQL?是一款為高效管理數(shù)據(jù)庫系統(tǒng)而創(chuàng)建的?SQL?系統(tǒng)軟件,這篇文章主要為大家詳細介紹了創(chuàng)建與?PostgreSQL?上的數(shù)據(jù)庫的連接的過程,需要的小伙伴可以了解下2023-10-10
Windows下PyCharm配置Anaconda環(huán)境(超詳細教程)
這篇文章主要介紹了Windows下PyCharm配置Anaconda環(huán)境,本文給大家分享一篇超詳細教程,通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07
Python使用StringIO和BytesIO讀寫內(nèi)存數(shù)據(jù)
這篇文章介紹了Python使用StringIO和BytesIO讀寫內(nèi)存數(shù)據(jù)的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05

