Я думаю, что есть 2.5 варианты, в порядке сложности:
Просто найти функцию C, которая определяет его при использовании C API шансов вы будете унаследованными от известного класса, который реализуется в С.. В этом случае вы выберете функцию C, используемую для метод и позвоните.
Получить класс от объекта, основание из класса:
а. PyObject* baseclass = self->ob_type->tp_base;
b. Используйте C API эквивалент super()
:
PyObject* baseclass = PyObject_CallFunctionObjArgs(&PySuper_Type,self->ob_type,self,NULL);
С базой найден, то вы можете использовать C API эквивалент GetAttr, чтобы получить соответствующую функцию:
.
/* check baseclass against null */
PyObject* func = PyObject_GetAttrString(baseclass,"function_name");
/* check func is not null */
PyObject* result = PyObject_CallFunctionObjArgs(self,other_arguments..., NULL); /* adjust arguments here */
Py_DECREF(func);
// decref result?
Вы можете использовать другой способ его вызова, но вам нужно убедиться, что вы передаете себя с аргументами.
Вариант 2b, вероятно, наиболее гибким, поскольку он должен работать, когда несколько баз определяются через tp_bases
.
Благодаря DavidW, ваш ответ сделал 99% от работы. Я отправляю в следующем ответе свой код, так как мне пришлось внести некоторые небольшие исправления в ваш предлагаемый код. –