python中元類在建立類和例項的作用

2021-10-04 18:19:21 字數 3968 閱讀 5103

最近在研究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...