Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C API和'object'的'tp_basicsize'从任意Python类派生?_Python_Python C Api - Fatal编程技术网

使用C API和'object'的'tp_basicsize'从任意Python类派生?

使用C API和'object'的'tp_basicsize'从任意Python类派生?,python,python-c-api,Python,Python C Api,我试图定义一个函数,该函数将使用C API创建一个Python类,该类派生自任意Python类型base,并在其原始C类对象布局中有一个额外的字段void*my_ptr。我希望它能够重用Python的\uuuu dict\uuu功能 我不是用C做的,所以我没有访问C宏的权限。我最初的尝试如下(伪代码): 在64位计算机上: PyType mySimpleClass = ...; PyType object = ...; mySimpleClass.tp_basesize // <- 32,

我试图定义一个函数,该函数将使用C API创建一个Python类,该类派生自任意Python类型
base
,并在其原始C类对象布局中有一个额外的字段
void*my_ptr
。我希望它能够重用Python的
\uuuu dict\uuu
功能

我不是用C做的,所以我没有访问C宏的权限。我最初的尝试如下(伪代码):

在64位计算机上:

PyType mySimpleClass = ...;
PyType object = ...;
mySimpleClass.tp_basesize // <- 32, includes __dict__
object.tp_basesize // <- 16, does not include space for __dict__
PyType mySimpleClass=。。。;
PyType对象=。。。;

mySimpleClass.tp_basesize/我想你想要的信息就在库的后面。如果该值设置为0,则基础没有
\uuuuu dict\uuuuu
,以及其他任何内容,并且它有

我不太清楚您是如何创建类型的,但至少通过调用
PyType\u Type
(在Python中编写
classx:
时内部使用的方法)添加了一个dict,除非定义了
\u slots\u
——听起来这是您想要发生的事情,也是正在发生的事情。这在我链接的文档部分的“继承”一节中有详细说明


因此,如果
tp\u dictoffset==0
(假设您没有定义
\uuuu slots\uuuu
),那么添加
sizeof(PyObject*)
来解释隐式添加的字典。

如果您不是用C做这件事,那么您用什么语言来做呢?C#。从上面的例子可以看出,实际上添加了两个指针大小的对象。你知道哪一个是第二个吗?@LOST:那应该是
\uuuuuweakref\uuuuu
。现在还不清楚像伪代码这样的代码从哪里来,或者,如果您像您所展示的那样调整了
tp\u basicsize
,为什么会在您的字段上而不是之后分配它们。
\uuuuu dict\uuuu
\uu weakref\uuuu
不是来自
Py\utpflags\uheaptype
标志。如果基类尚未提供它们,则
键入\u new
添加它们,除非
\u slots\u
表示不提供。您似乎没有调用
type\u new
。我怀疑(并希望)
new PyType(…)
实际上只是一个C#包装
type\u new
。但这似乎是“迷失”应该非常肯定的事情of@user2357112supportsMonica@DavidW您所指的
类型是什么?我们使用
PyType\u GenericAlloc
然后填充结构。
class MySimpleClass: pass
PyType mySimpleClass = ...;
PyType object = ...;
mySimpleClass.tp_basesize // <- 32, includes __dict__
object.tp_basesize // <- 16, does not include space for __dict__