1樓:哦是誰
class
Meta
(type
):def
__call__
(cls,*
args,**
kwargs
("entering Meta.__call__()"
)ins
=super().
__call__(*
args,**
kwargs
("exiting Meta.__call__(): "
,ins
)return
insclass
Foo(
metaclass
=Meta
):def
__new__
(cls,*
args,**
kwargs
("entering Class.__new__()")rv
=super().
__new__
(cls,*
args,**
kwargs
("exiting Class.__new__()"
)return
rvdef
__init__
(self,*
args,**
kwargs
("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
("entering Meta.__call__()"
)# ins = super().__call__(*args, **kwargs)
# print("exiting Meta.__call__(): ", ins)
# return ins
class
Foo(
metaclass
=Meta
):def
__new__
(cls,*
args,**
kwargs
("entering Class.__new__()")rv
=super().
__new__
(cls,*
args,**
kwargs
("exiting Class.__new__()"
)return
rvdef
__init__
(self,*
args,**
kwargs
("executing Class.__init__()"
)super().
__init__(*
args,**
kwargs)a
=Foo
('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 它的設計目的...