创建新的“type”实例(即类)时,类“type.__init__”和“type.__new__”做什么?

Lif*_*ang 5 python

众所周知,classPython 中创建 new 时有很多工作是在幕后完成的,例如设置__dict____class____metaclass__等属性。

我知道,当创建一个新类时,该type.__new__方法将被调用,并且type.__init__也会在call.__new__返回type. 所以我猜这两种方法可能负责一些工作,但我在文档中找不到关于它们实际功能的任何描述。我的问题是,这两种方法到底是做什么用的class

编辑:

我知道元类是什么以及元类在创建实例的过程中大致做了什么type,但我想知道这两种方法如何配合来完成创建实例的工作type。也许@BrenBarn 是对的,这与实现相关。我只是想确认一下。例如,如果我__new__在自己的元类中重写该方法,并直接T返回,而不是像人们通常所做的那样在基类中调用,那么既不会被调用,也不会被调用,因为返回的对象不是 的实例。如果是这样,由于缺少 ,我会错过什么 ?而且,我可以期望这在各种实现中都是一致的行为吗?type(clsname, bases, dct)__new__typeT.__init__type.__init__T__init__

Ray*_*ger 2

我想知道这两种方法如何配合来完成创建类型实例的工作

type.__init__方法只负责检查是否有 1 或 3 个参数并且没有关键字参数。其 C 源代码位于type_init()中的函数中Objects/typeobject.c

type.__new__方法完成创建新类的所有其余工作。type_new_impl以下是in的步骤Objects/typeobject.c

  • 类型_new_init()
  • type_new_set_attrs()
  • PyType_Ready()
  • fixup_slot_dispatchers()
  • type_new_set_names()
  • type_new_init_subclass()