先明白一點(diǎn):類繼承了object拖云,類類型是type的實(shí)例
__call__
實(shí)際就是定義對(duì)象關(guān)于()
運(yùn)算符的執(zhí)行邏輯(重載()
運(yùn)算符)蒿辙,當(dāng)類對(duì)象foo()
時(shí)會(huì)執(zhí)行類類型Foo中的__call__
代碼段
定義一個(gè)類
class Foo():
def __init__(self):
pass
def __call__(self):
pass
-
類型Foo是type的實(shí)例化對(duì)象膘侮,因此在執(zhí)行
Foo()
時(shí)向挖,實(shí)際調(diào)用的是type
的def __call__
邏輯月帝,會(huì)執(zhí)行如下代碼class type(object): # 這邊的obj_type跟cls一樣 def __call__(obj_type, *args, **kwargs): # 通過__new__創(chuàng)建一個(gè)空的類實(shí)例先馆,如果obj_type沒有__new__則使用type.__new__ obj = obj_type.__new__(*args, **kwargs) # 進(jìn)行類型檢查 if obj is not None and issubclass(obj, obj_type): # 對(duì)類進(jìn)行__init__初始化 obj.__init__(*args, **kwargs) # 返回類實(shí)例 return obj
從而創(chuàng)建一個(gè)foo對(duì)象
Foo.__call__
重載()
運(yùn)算符,影響的是foo對(duì)象
的()
泣懊。Foo()
得到一個(gè)Foo的實(shí)例化對(duì)象foo【執(zhí)行的是type對(duì)象的()運(yùn)算符】伸辟;foo()
會(huì)執(zhí)行class Foo
中的def __call__
邏輯【執(zhí)行的是Foo對(duì)象的()運(yùn)算符】-
這也是為什么查看類的class(類型)是
type
:type(Foo)
===><class 'type'>
class Foo(): def __init__(self): pass print(type(Foo)) print(type(Foo())) """ <class 'type'> <class '__main__.Foo'> """