Class Property Using Python C-API


Answer :

Similar to these Python solutions, you will have to create a classproperty type in C and implement its tp_descr_get function (which corresponds to __get__ in Python).

Then, if you want to use that in a C type, you would have to create an instance of your classproperty type and insert it into dictionary of your type (tp_dict slot of your type).

Follow up:

It would seem that it's impossible to set an attribute of a C type. The tp_setattro function of the metaclass (PyType_Type) raises a "can't set attributes of built-in/extension type" exception for all non-heap types (types with no Py_TPFLAGS_HEAPTYPE flag). This flag is set for dynamic types. You could make your type dynamic but it might be more work then it's worth.

This means that the solution I gave initially allows you to create a property (as in: computed attribute) on a C type object with the limitation that it's read only. For setting you could use a class/static-method (METH_CLASS/METH_STATIC flag on a method in tp_methods).


I'll try to convey the essence of what I've discovered about using class static properties.

My (edited) code is as follows:

// Prepare your type object, which you will no doubt complete  // by calling PyType_Ready, as here. if (PyType_Ready(typeObj) < 0) {   return; }  Py_INCREF(typeObj); PyModule_AddObject(module, typeName, (PyObject*) typeObj);  // Now we add static members directly to the type's tp_dict, but  // only *after* we've registered the type (above) PyObject* dict = typeObj->tp_dict;  // You'll have your own wrapper / C values in the line below. This is just // a pseudo-version of what I am (successfully) using. PyObject* tmp = MyCreateWrapper(myStaticValueInC);  // Py_INCREF(tmp); // You may need this, depending on how line above works.  PyDict_SetItemString(dict, staticPropertyName, tmp);  Py_DECREF(tmp); 

I believe all the essentials are here in terms of what order to construct your code in order to implement a class property.


Comments

Popular posts from this blog

Are Regular VACUUM ANALYZE Still Recommended Under 9.1?

Can Feynman Diagrams Be Used To Represent Any Perturbation Theory?