弄明白Python中的__call__

先明白一点:类继承了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'>
    """
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 包(lib)、模块(module) 在Python中,存在包和模块两个常见概念。 模块:编写Python代码的py...
    清清子衿木子水心阅读 3,836评论 0 27
  • 〇、前言 本文共108张图,流量党请慎重! 历时1个半月,我把自己学习Python基础知识的框架详细梳理了一遍。 ...
    Raxxie阅读 19,104评论 17 410
  • 1.列出 5 个常用 Python 标准库? python标准库就是安装python时默认自带的库,常用的标准库有...
    千里寻花阅读 250评论 0 0
  • Python基础常识 python 区分大小写 Andy != andyprint("\r", end="") ...
    sophia4syn阅读 527评论 0 1
  • 这是一个在看开源代码时配到了单例元类写法后的一个原理贴,可以帮你彻底弄清元类、以及__new__和__call__...
    我只要喝点果粒橙阅读 752评论 0 1