python中的元類metaclass

2021-09-24 10:36:04 字數 999 閱讀 2896

元類metaclass

元類是可以讓你定義某些類是如何被建立的。從根本上說,賦予你如何建立類的控制權。

元類也是乙個類,是乙個type類。

元類一般用於建立類。在執行類定義時,直譯器必須要知道這個類的正確的元類,如果此屬性沒有定義,它會向上查詢父類中的__metaclass__屬性。如果還沒發現,就查詢全域性變數。 

對於傳統類來說,它們的元類是types.classtype。

元類也有構造器,傳遞三個引數:類名,從基類繼承資料的元組,和類屬性字典

下面我們來定義乙個元類,要求寫類的時候必須給類提供乙個__str__()方法,如果沒有提供__repr__()方法,則給你警告。

from warnings import warn

#元類需要繼承type類

class reqstrsugrepr(type):

def __init__(cls, name, bases, attrd):

#建構函式需要傳遞的引數為類名,基類,類屬性字典

super(reqstrsugrepr, cls).__init__(name, bases, attrd)

# 判斷__str__字串是否在類的屬性字典裡

if '__str__' not in attrd:

raise typeerror('class requires overriding of __str__()')

if '__repr__' not in attrd:

warn('class suggests overriding of __repr__()\n', stacklevel=3)

class foo(object):

#給類指定元類 

__metaclass__ = reqstrsugrepr

def foo(self):

pass

#這一段**不用建立類來測試,直接執行一下就會報錯,可見元類的功力。

python中的元類

python中的元類大家都可能比較很陌生,因為大家都聽說過99 的情況下是用不到元類的,但是大家對類確很了解,大家都知道在python中萬物皆物件,那麼python中的類是不是物件呢?物件的樣子 1,物件可以在程式中動態的進行建立,python的語言動態特性。2,物件可以通過 class 獲取該物件...

Python 中的元類

如果看完以後還是感覺莫名其妙,執行這樣乙個demo 可能會對你有所幫助 元類程式設計在我看來,如果你想開發一些框架,可以嘗試一下 class upperattrmetaclass type type dict def new cls,cls name,bases,attr dict news cls...

python中的元類

目錄其他 我們建立乙個類目的是為了建立該類的例項物件,而元類就是用來建立類的。換個理解方式就是,元類就是建立類的類。在python中可以使用type函式建立乙個類,參考 python中type的用法 用法如下 tpye name,bases,dict 實際上type 函式就是乙個元類,是python...