调用用户定义类型时,是什么导致 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"。
调用用户自定义类型创建新对象时,调用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 isJoe
, andJoe
does not define a custom__new__
method, thentype->tp_new
defers to thetp_new
slot of the base type.The base type of
Joe
[...] isobject
. Theobject.tp_new
slot is implemented in CPython by theobject_new
function inObjects/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"。