在 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 是一个公共字段,可以用任何内容替换)。
如文档中所述,还有另一种创建堆类型的方法,这种方法存在的时间更长,并且本质上更稳定:使用三个参数调用类型:
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扩展,所以使用起来不太愉快。