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

时间:2018-04-16 16:43:10

标签: python types cpython language-implementation

当调用用户定义的类型来创建新对象时,将调用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 [...]的基本类型为objectobject.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变量?

1 个答案:

答案 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变量"。