调用用户定义类型时,是什么导致 tp_new 引用 object_new?

When a user-defined type is called, what causes tp_new to reference object_new?

调用用户自定义类型创建新对象时,调用type_call。它的第一个参数是PyObject *type。然后,调用type->tp_new创建对象。

我正在阅读 Eli Bendersky 的 article (And following along CPyton's source code),其中解释说在这种情况下,调用 tp_new 会调用 object_new。这是它的工作原理(Joe 是用户定义的类型;添加了斜体):

Since the type parameter passed to type_call in our case is Joe, and Joe does not define a custom __new__ method, then type->tp_new defers to the tp_new slot of the base type.

The base type of Joe [...] is object. The object.tp_new slot is implemented in CPython by the object_new function in Objects/typeobject.c.

所以,如果我理解正确的话,那么如果 type->tp_new 引用 object_new,那么 type 的运行时类型必须是 PyBaseObject_Type*(因为只有 PyBaseObject_Type.tp_new 引用 object_new).

我的问题:在调用 type_call 之前,使 type 指向 PyBaseObject_Type 变量的步骤是什么?

您误解了事情的运作方式。在用户定义的 class 的设置过程中,如果 class 没有定义它自己的 __new__,它的 tp_new 是从 "dominant base" 复制的。您可以在 inherit_special:

中查看相关代码
    if (base != &PyBaseObject_Type ||
        (type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
        if (type->tp_new == NULL)
            type->tp_new = base->tp_new;
    }

class 本身不需要是 PyBaseObject_Type 或 "a PyBaseObject_Type variable"。