使用C API和'object'的'tp_basicsize'从任意Python类派生?
我试图定义一个函数,该函数将使用C API创建一个Python类,该类派生自任意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,
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__