gpt4 book ai didi

python - PyObject.ob_type 在 CPython 2.7 中如何初始化/设置

转载 作者:行者123 更新时间:2023-12-01 01:54:19 25 4
gpt4 key购买 nike

我正在研究 isinstance() 函数如何在 CPython 2.7 中工作

现在我有一个包含两个 Python 文件的示例:lib1.py lib2.py

In lib1.py:
from a.b import lib2
def func_h():
ob = lib2.X()
print(isinstance(ob, lib2.X))

In lib2.py:
class X(object):
a = 1

打印结果:True

然后我深入研究 CPython 源代码 https://github.com/python/cpython/blob/ad65d09fd02512b2ccf500f6c11063f705c9cd28/Objects/abstract.c#L2945

CPython 在哪里进行此检查:

if (Py_TYPE(inst) == (PyTypeObject *)cls)
return 1;

其中 Py_TYPE() 是宏

#define Py_TYPE(ob)             (((PyObject*)(ob))->ob_type)

有谁知道CPython在程序启动期间如何初始化或设置ob_type的线索吗?

最佳答案

通常,这种情况发生在 PyObject_Init (或 PyObject_InitVar,我不会再次提及,但全面存在等效的变体),或 PyObject_INIT 宏(它以更快的方式执行相同的操作,但不能保证与同一平台上构建的其他解释器二进制兼容)。 PyObject_Init 的文档说:

Initialize a newly-allocated object op with its type and initial reference. Returns the initialized object. If type indicates that the object participates in the cyclic garbage detector, it is added to the detector’s set of observed objects. Other fields of the object are not affected.

您可以看到the source in object.c :

PyObject *
PyObject_Init(PyObject *op, PyTypeObject *tp)
{
if (op == NULL)
return PyErr_NoMemory();
/* Any changes should be reflected in PyObject_INIT (objimpl.h) */
Py_TYPE(op) = tp;
_Py_NewReference(op);
return op;
}

更多详情,请参阅 the comments in objimpl.h .

<小时/>

当从 Python(或通过高级 C API)构造对象时:

  • 该类型的 __new__方法或tp_new插槽被调用。
    • 这通常继承自或super object_new ,它调用 PyType_GenericNew .
    • …或者它委托(delegate)给其他一些构造函数(最终让你回到这里)
    • …或者返回一些已经存在的对象
    • ...但如果没有,则必须手动调用tp_alloc
  • PyType_GenericNew 调用类型的 tp_alloc slot(Python 没有专门的方法来实现这一点)。
    • 这通常继承自或super PyType_GenericAlloc ,它调用 PyObject_INIT 宏。
    • ...但如果没有,tp_alloc 必须调用 PyObject_Init 系列函数或宏之一,或者自己执行相同的操作。
<小时/>

C 扩展模块中的代码和内部解释器代码可能:

  • 使用相同的高级 API
  • ...或调用PyObject_New,它分配对象并对其调用PyObject_Init,并转换结果指针
  • ...或者直接调用 PyObject_Init (当它知道它正在构造的类型时,不会自定义 tp_newtp_alloc tp_init)
  • ...或手动构造对象,但在某些时候它必须直接或间接调用 PyObject_Init 系列之一,或者本身执行相同的操作,就像自定义 tp_alloc 一样>
  • ...或者静态分配常量对象而不是在堆上,例如 PyNone以及许多内置和扩展类型对象,在这种情况下,类型(当然也必须是静态常量)仅在结构初始值设定项中指定。

关于python - PyObject.ob_type 在 CPython 2.7 中如何初始化/设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50382335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com