美文网首页
弄明白Python中的__call__

弄明白Python中的__call__

作者: 我只要喝点果粒橙 | 来源:发表于2022-09-01 23:01 被阅读0次

先明白一点:类继承了object,类类型是type的实例

__call__实际就是定义对象关于()运算符的执行逻辑(重载()运算符),当 类对象foo()时会执行类类型Foo中的__call__代码段

定义一个类

class Foo():
    def __init__(self):
        pass
    def __call__(self):
        pass
  1. 类型Foo是type的实例化对象,因此在执行Foo()时,实际调用的是typedef __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对象

  2. Foo.__call__重载()运算符,影响的是foo对象()Foo()得到一个Foo的实例化对象foo【执行的是type对象的()运算符】;foo()会执行class Foo中的def __call__逻辑【执行的是Foo对象的()运算符】

  3. 这也是为什么查看类的class(类型)是typetype(Foo)===><class 'type'>

    class Foo():
        def __init__(self):
            pass
    
    print(type(Foo))
    print(type(Foo()))
    """
    <class 'type'>
    <class '__main__.Foo'>
    """
    

相关文章

网友评论

      本文标题:弄明白Python中的__call__

      本文链接:https://www.haomeiwen.com/subject/eqnynrtx.html