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
关键逻辑解释
创建类对象的分支:
当cls就是type自身时,说明我们正在调用元类来生成新的类。这时候会先调用type.__new__构建类的结构,再用type.__init__完成类的属性、基类等初始化,最后返回这个新的类对象。创建实例的分支:
当cls是普通的类(比如Animal)时,说明我们正在调用类来生成实例。这时候会先调用该类的__new__方法创建实例的内存结构,然后如果创建的实例确实属于该类,再调用__init__方法完成实例的初始化,最后返回实例。
内容的提问来源于stack exchange,提问作者user3103957
相关产品推荐
相关产品推荐

