Python:具有元类的堆类型

问题描述 投票:0回答:1

在 Python c-api 中:如何创建具有元类的堆类型?我很清楚

PyType_FromSpec
和衍生物,他们可以做到这一点(来自文档):

版本 3.12 中的更改:该函数现在查找并使用与所提供的基类相对应的元类。以前,仅返回类型实例。

元类的 tp_new 被忽略。这可能会导致初始化不完整。不推荐创建元类覆盖 tp_new 的类,并且在 Python 3.14+ 中将不再允许这样做。

我对此有两个一问题:Python 3.12 中添加了对元类的支持,我想支持 Python 3.8+。第二个:如果类名不是静态定义的(使用 malloc 创建,例如:字符串连接),对于 python < 3.11, this will leak, as that function doesn't copy the buffer in these versions and there is no good way of freeing that buffer (PyTypeObject->tp_name 是一个公共字段,可以用任何内容替换)。

python c metaclass python-c-api
1个回答
0
投票

文档中所述,还有另一种创建堆类型的方法,这种方法存在的时间更长,并且本质上更稳定:使用三个参数调用类型:

type(name, mro, dict)
,或者对于元类型:
meta(name, mro, dict)
/
type.__call__(meta, name, mro, dict)
.

args = Py_BuildValue("sOO", class_name, super_classes, dict);
PyObject *my_type = PyType_Type.tp_call((PyObject *)&meta_type, args);

它的缺点是这个API是为Python代码创建的,而不是C扩展,所以使用起来不太愉快。

© www.soinside.com 2019 - 2024. All rights reserved.