什么是Python 3中的PyClass_New等价物?

Suj*_*ane 6 c python python-c-api

以前我使用C API创建了一些Python类.当我要使用Python 3+构建旧项目时,它会产生以下编译错误

PyClass_New was not declared in this scope
Py_InitModule was not declared in this scope

等价物是什么?

PyObject *pClassDic = PyDict_New();
PyObject *pClassName = PyBytes_FromString("MyClass");
PyObject *pClass = PyClass_New(NULL, pClassDic, pClassName);
Run Code Online (Sandbox Code Playgroud)

use*_*450 5

如果您不想经历设置对象和类型结构的麻烦,您应该能够通过type(name, bases, dict)从 C调用 Python 来创建一个新类:

PyObject *pClassName = PyBytes_FromString("MyClass");
PyObject *pClassBases = PyTuple_New(0); // An empty tuple for bases is equivalent to `(object,)`
PyObject *pClassDic = PyDict_New();

// pClass = type(pClassName, pClassBases, pClassDic)
PyObject *pClass = PyObject_CallFunctionObjArgs(PyType_Type, pClassName, pClassBases, pClassDic, NULL);

Py_CLEAR(pClassName);
Py_CLEAR(pClassBases);
Py_CLEAR(pClassDic);
Run Code Online (Sandbox Code Playgroud)