Python元類中的 call 對繼承元類的子類的 init 和 new 有怎樣的影響?

時間 2021-06-02 06:13:34

1樓:哦是誰

class

Meta

(type

):def

__call__

(cls,*

args,**

kwargs

):print

("entering Meta.__call__()"

)ins

=super().

__call__(*

args,**

kwargs

)print

("exiting Meta.__call__(): "

,ins

)return

insclass

Foo(

metaclass

=Meta

):def

__new__

(cls,*

args,**

kwargs

):print

("entering Class.__new__()")rv

=super().

__new__

(cls,*

args,**

kwargs

)print

("exiting Class.__new__()"

)return

rvdef

__init__

(self,*

args,**

kwargs

):print

("executing Class.__init__()"

)super().

__init__(*

args,**

kwargs)a

=Foo

()'''

entering Meta.__call__()

entering Class.__new__()

exiting Class.__new__()

executing Class.__init__()

exiting Meta.__call__(): <__main__.Foo object at 0x0C5974B0>

'''從print的資訊看,例項化時,會呼叫元類的__call__方法,並將__call__方法的返回值賦值給變數a,而super().__call__會呼叫Foo類的__new__和__init__方法來獲得例項化物件。

你的程式二,沒有super().__call__,自然就沒有呼叫Foo類的__new__和__init__方法,而且__call__返回None,此時變數a是None。如下:

class

Meta

(type

):def

__call__

(cls,*

args,**

kwargs

):print

("entering Meta.__call__()"

)# ins = super().__call__(*args, **kwargs)

# print("exiting Meta.__call__(): ", ins)

# return ins

class

Foo(

metaclass

=Meta

):def

__new__

(cls,*

args,**

kwargs

):print

("entering Class.__new__()")rv

=super().

__new__

(cls,*

args,**

kwargs

)print

("exiting Class.__new__()"

)return

rvdef

__init__

(self,*

args,**

kwargs

):print

("executing Class.__init__()"

)super().

__init__(*

args,**

kwargs)a

=Foo

()print

('a is None: ',a

isNone

)'''

entering Meta.__call__()

a is None: True'''

2樓:黃哥

請看看Understanding Python metaclasses - … and Python objects in general

和Using the __call__ method of a metaclass instead of __new__?

請看第乙個鏈結中的

如果__call__ 沒有返回值,就沒有取到它的作用,具體的好好看看該文章吧。

對SNH48公演中MIX和call的一些疑問?

1.成員介紹完catch phrase後的call,應援會的統一組織有沒有其必要性?怎麼看待毒瘤call的存在?有必要。其實沒有毒瘤call是墜吼的,但是禁不住。不如統一一下免得沒完沒了call個沒夠 2.爆裂mix,有人認為拉爆裂不是akb的mix,有的認為這樣有氣勢,有的認為 烏拉嘿 喊不齊,拉...

為什麼 Python 3 中類可以直接呼叫例項方法,Python 2 中卻不行?

Manjusaka 靈劍 老大已經說了 3.0 移除了 unbound method 的概念,直接呼叫函式就被當做乙個普通函式處理 詳情參見 What s New In Python 3.0 曲奇 確實和直譯器的實現有關係。但我建議不要在這個方向上深究,鑽牛角尖無助於提公升程式設計功力。Python...

Python中既然可以直接通過父類名呼叫父類方法為什麼還會存在super函式?

拾人牙慧 不要一說到 super 就想到父類,super 指的是 MRO Method Resolution Order,它代表了類繼承的順序 中的下乙個類!def super cls,inst mro inst.class mro return mro mro.index cls 1 它的設計目的...