为了简单起见,这里只演示 char* 版本; name 形参的类型是 char* 和 PyObject* 风格接口之间的唯一区别。 这个示例实际上做了与上面的泛用示例相同的事情,但没有使用在 Python 2.2 中增加的泛用支持。 它解释了处理句柄函数是如何被调用的,因此如果你确实需要扩展它们的功能,你就会明白有什么是需要做的。
tp_getattr 处理句柄会在对象需要进行属性查找时被调用。 它被调用的场合与一个类的 __getattr__() 方法要被调用的场合相同。
例如:
static PyObject *
newdatatype_getattr(newdatatypeobject *obj, char *name)
{
if (strcmp(name, "data") == 0)
{
return PyLong_FromLong(obj->data);
}
PyErr_Format(PyExc_AttributeError,
"'%.100s' object has no attribute '%.400s'",
Py_TYPE(obj)->tp_name, name);
return NULL;
}
当调用类实例的 __setattr__() 或 __delattr__() 方法时会调用 tp_setattr 处理句柄。 当需要删除一个属性时,第三个形参将为 NULL。 下面是一个简单地引发异常的例子;如果这确实是你想要的,则 tp_setattr 处理句柄应当被设为 NULL。
static int
newdatatype_setattr(newdatatypeobject *obj, char *name, PyObject *v)
{
PyErr_Format(PyExc_RuntimeError, "Read-only attribute: %s", name);
return -1;
} |