当调用用户定义的类型来创建新对象时,将调用type_call
。它的第一个参数是PyObject *type
。然后,调用type->tp_new
来创建对象。
我正在阅读Eli Bendersky的article(并跟随CPyton's source code),在此处解释说,在这种情况下,调用tp_new
会调用object_new
}。以下是它的工作原理(Joe
是用户定义的类型;添加了斜体):
由于在我们的案例中传递给
type_call
的类型参数是Joe
, 并且Joe
未定义自定义__new__
方法,type->tp_new
推迟到基本类型的tp_new
广告位。
Joe
[...]的基本类型为object
。object.tp_new
广告位是 由object_new
函数在CPython中实现Objects/typeobject.c
。
因此,如果我理解正确,那么如果type->tp_new
引用object_new
,则type
的运行时类型必须为PyBaseObject_Type*
(因为只有{{1}引用PyBaseObject_Type.tp_new
)。
我的问题:调用object_new
之前的步骤是什么 - 使type_call
指向type
变量?
答案 0 :(得分:0)
你误解了事情的运作方式。在设置用户定义的类期间,如果类没有定义自己的__new__
,则其tp_new
将从"显性基类"中复制。您可以在inherit_special
中找到相应的代码:
if (base != &PyBaseObject_Type ||
(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
if (type->tp_new == NULL)
type->tp_new = base->tp_new;
}
课程本身不需要PyBaseObject_Type
或" PyBaseObject_Type
变量"。