先明白一点:类继承了object,类类型是type的实例
__call__
实际就是定义对象关于()
运算符的执行逻辑(重载()
运算符),当类对象foo()
时会执行类类型Foo中的__call__
代码段
定义一个类
class Foo():
def __init__(self):
pass
def __call__(self):
pass
-
类型Foo是type的实例化对象,因此在执行
Foo()
时,实际调用的是type
的def __call__
逻辑,会执行如下代码class type(object): # 这边的obj_type跟cls一样 def __call__(obj_type, *args, **kwargs): # 通过__new__创建一个空的类实例,如果obj_type没有__new__则使用type.__new__ obj = obj_type.__new__(*args, **kwargs) # 进行类型检查 if obj is not None and issubclass(obj, obj_type): # 对类进行__init__初始化 obj.__init__(*args, **kwargs) # 返回类实例 return obj
从而创建一个foo对象
-
Foo.__call__
重载()
运算符,影响的是foo对象
的()
。Foo()
得到一个Foo的实例化对象foo【执行的是type对象的()运算符】;foo()
会执行class Foo
中的def __call__
逻辑【执行的是Foo对象的()运算符】 -
这也是为什么查看类的class(类型)是
type
:type(Foo)
===><class 'type'>
class Foo(): def __init__(self): pass print(type(Foo)) print(type(Foo())) """ <class 'type'> <class '__main__.Foo'> """
网友评论