You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中type元类__call__方法的工作原理及伪代码问询

关于type元类__call__方法区分两种场景的伪代码

首先明确两个核心场景的触发条件:

  • 当调用type(类名, 基类元组, 属性字典)时,本质是调用type.__call__(type, ...),目的是创建类对象
  • 当调用Animal()(Animal是type的实例)时,本质是调用type.__call__(Animal, ...),目的是创建类的实例

type元类的__call__方法通过判断自身参数cls是否为type本身来区分这两种场景,以下是简化的伪代码实现:

class type:
    def __call__(cls, *args, **kwargs):
        # 场景1:创建类对象(调用type(...)时触发)
        if cls is type:
            # 先调用type.__new__创建类的骨架
            new_class = type.__new__(cls, *args, **kwargs)
            # 再调用type.__init__完成类的初始化(比如设置类名、基类、命名空间)
            type.__init__(new_class, *args, **kwargs)
            return new_class
        # 场景2:创建类的实例(调用类本身时触发)
        else:
            # 先调用目标类的__new__创建实例对象
            instance = cls.__new__(cls, *args, **kwargs)
            # 仅当实例是目标类的实例时,调用__init__初始化
            if isinstance(instance, cls):
                cls.__init__(instance, *args, **kwargs)
            return instance

关键逻辑解释

  1. 创建类对象的分支:
    当cls就是type自身时,说明我们正在调用元类来生成新的类。这时候会先调用type.__new__构建类的结构,再用type.__init__完成类的属性、基类等初始化,最后返回这个新的类对象。

  2. 创建实例的分支:
    当cls是普通的类(比如Animal)时,说明我们正在调用类来生成实例。这时候会先调用该类的__new__方法创建实例的内存结构,然后如果创建的实例确实属于该类,再调用__init__方法完成实例的初始化,最后返回实例。

内容的提问来源于stack exchange,提问作者user3103957

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 06:03:20