Если вы хотите изменить атрибуты функций как функций, так и методов экземпляра из C, то вам нужно проверить тип вызываемого объекта.
Итак, если у вас есть PyObject некоторого типа вызываемого, вы можете проверить его следующим образом:
PyObject *callable; // set to something callable
PyObject *setting; // set to something
if(PyMethod_Check(callable)){
PyObject_SetAttrString(PyMethod_Function(callable),"attribute",setting);
}else{
PyObject_SetAttrString(callable,"attribute",setting);
}
...
// and the inverse
if(PyMethod_Check(callable){
if(PyObject_HasAttrString(PyMethod_Function(callable),"attribute")){
PyObject_DelAttrString(PyMethod_Function(callable),"attribute");
}
}else{
if(PyObject_HasAttrString(callable,"attribute")){
PyObject_DelAttrString(callable,"attribute");
}
}
Теперь указанный код agf работает из Python для методов экземпляра. Если я просто попытаюсь установить атрибут метода экземпляра, он не найдет атрибут, независимо от того, как я пытался получить к нему доступ из Python.
Я столкнулся с этой проблемой, и вопрос Ли Хаои с ответом agf помог мне понять, что нужно изменить. Я полагал, что кто-то найдет этот вопрос и ответит снова, ища, как решить эту проблему через C.
Edit:
Примечание: это для Python 2.7.x. Python 3.x использует различные вызовы функций.