最近在研究backtrader
的底層源**,作者用類若干的類和元類,以前沒有接觸過元類,現在經過查了一些資料,知道了元類是建立類的類,可以用來控制類的建立和例項的建立過程,也可以隱性地繼承屬性和方法,元類的常見的應用有建立單類模式、orm。
由於元類的理解比較抽象,可以用下面的**理解元類在建立類和例項時的作用,
class
metaclass1
(type):
def__new__
(cls, clsname, bases, dct)
:print
("基於type的類metaclass1,....__new__"
)return
type
.__new__(cls, clsname, bases, dct)
def__call__
(self,
*args,
**kwargs)
:print
("基於type的類metaclass1,....__call__"
)return
super()
.__call__(
*args,
**kwargs)
class
metaclass2
(metaclass1)
:def
__new__
(cls, clsname, bases, dct)
:print
("基於metaclass1的類metaclass2,....__new__"
)return
super()
.__new__(cls, clsname, bases, dct)
def__call__
(self,
*args,
**kwargs)
:print
("基於metaclass1的類metaclass2,....__call__"
)return
super()
.__call__(
*args,
**kwargs)
print
("建立類a-------"
)class
a(metaclass=metaclass2)
:def
__new__
(cls,
*agrs,
**kwds)
: inst =
super()
.__new__(cls,
*agrs,
**kwds)
print
("由metaclass2建立的類a,....__new__...正在建立類的例項"
)return inst
def__init__
(self)
:print
("由metaclass2建立的類a,....__init__...正在建立類的例項"
)super()
.__init__(
)class
metaclass3
(type):
def__new__
(cls, clsname, bases, dct)
:print
("基於metaclass1的類metaclass2,....__call__"
)return
super()
.__new__(cls, clsname, bases, dct)
print
('建立a的子類m-------'
)class
m(a, metaclass=
type):
def__new__
(cls,
*agrs,
**kwds)
:print
("類a的子類m,...__new__...正在建立類的例項"
)return
super()
.__new__(cls,
*agrs,
**kwds)
def__init__
(self)
:print
("類a的子類m,...__init__...正在建立類的例項"
)super()
.__init__(
)print
("建立a的例項--------"
)a = a(
)print
("建立m的例項--------"
)m = m(
)
建立類a---
----
基於metaclass1的類metaclass2,..
..__new__
基於type的類metaclass1,..
..__new__
建立a的子類m---
----
基於metaclass1的類metaclass2,..
..__new__
基於type的類metaclass1,..
..__new__
建立a的例項---
----
-基於metaclass1的類metaclass2,..
..__call__
基於type的類metaclass1,..
..__call__
由metaclass2建立的類a,..
..__new__.
..正在建立類的例項
由metaclass2建立的類a,..
..__init__.
..正在建立類的例項
建立m的例項---
----
-基於metaclass1的類metaclass2,..
..__call__
基於type的類metaclass1,..
..__call__
類a的子類m,..
.__new__.
..正在建立類的例項
由metaclass2建立的類a,..
..__new__.
..正在建立類的例項
類a的子類m,..
.__init__.
..正在建立類的例項
由metaclass2建立的類a,..
..__init__.
..正在建立類的例項
這裡由兩條關係:父類-子類繼承關係、元類-類建立關係。
通過元類建立類時,子類m
不必另外宣告元類,因為建立m
時,會預設呼叫父類a
的元類,如果設定metaclass
為父類的元類外的別的元類,程式會出錯。用元類建立類時,依次呼叫元類的__new__
方法,該方法的引數分別為:
通過這些引數可以看出,這是在得到類的屬性後才會進入到元類中。
建立例項涉及到類的__init__
、__new__
和元類的__call__
。
__call__
:首先呼叫父類的該方法,如果元類有繼承關係,先依次(子元類->父元類)呼叫完所有元類的__call__
方法,接著呼叫類的__new__
方法
__new__
:呼叫完元類的__new__
方法後,接著呼叫類的__new__
,如果類有繼承關係,則依次(子類->父類)呼叫完所有類的__new__
方法
__init__
:呼叫完所有類的__new__
方法後,接著呼叫類的__init__
,如果有類的繼承關係,則依次(子類->父類)呼叫所有類的__init__
方法
python元類的使用 python中元類用法例項
1.元類 metaclass 是用來建立類的類 2.type object 返回乙個物件的型別,與object.class 的值相同,type name,bases,dict 建立乙個新的type型別,name就是新class的name,值存到 name 屬性中,bases是tuple型別,值會存到...
python 類 建立類和使用類
coding utf 8 目標 建立 狗這個類 例項化並呼叫 屬性與函式 created on sat nov 16 23 05 32 2019 author huzhenxing class dog 一次模擬小狗的簡單嘗試 def init self,name,age 初始化屬性 name 和 a...
python中元類的 call
元類是類的類,元類之於類就相當於類之於例項。元類的new方法會建立乙個類並返回,就像類的new方法會建立乙個例項並返回一樣。元類中其他方法的定義類似於類中方法的定義,例如 class meta type def new cls,name,bases,dct cls為元類meta return typ...