元類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...