如果要从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来解决这个问题时,找到这个问题并再次给出答案
编辑:
注意:这是针对Python2.7.x的。Python3.x使用不同的函数调用。