我正在阅读几篇文章来了解如何在 Python 中创建类类型( 1 、 2 、 3 ),并遵循 Python 的源代码( typeobject.c )。
我的问题:当创建一个新的用户定义类型时,它的元类的 __new__
和 __init__
在哪里被调用?
我来解释一下:
假设我们有一个简单的用户定义类型:
class A(object): pass
为了创建类型A
,最终会调用type_call
,并将type
作为其第一个参数。在本例中,type
实际上是 PyType_Type
。
在type_call
内部,调用tp_new
,在本例中意味着对type_new
的调用。
现在,在 type_new
内部,新类型最终分配为:
/* Allocate the type object */
type = (PyTypeObject *)metatype->tp_alloc(metatype, nslots);
当type_new
完成时,它会将type
返回给type_call
。然后,type_call
调用 tp_init
- 这意味着调用 type_init
,它调用 object_init
,这实际上并不做任何事。
在某个地方,应该调用type
的__new__
和__init__
。我是否错过了这些调用,或者它们是在 type_call
外部调用的?
最佳答案
tp_new
和tp_init
是 __new__
的 C 级对应项和__init__
。调用 tp_new
和tp_init
是 __new__
和__init__
来电。
如果您覆盖type.__new__
或type.__init__
在您定义的元类中,相应的 tp_new
或tp_init
元类中的插槽将设置为 C 级 functions搜索并调用您的 Python 级覆盖。
关于python - 用户定义类型的元类 __new__ 和 __init__ 在哪里被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49661409/