LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 312|回复: 0

类型专属的属性管理

[复制链接]
发表于 2024-1-19 18:52:56 | 显示全部楼层 |阅读模式


为了简单起见,这里只演示 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;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表