对于每个可支持属性操作的对象,相应的类型必须提供用于控制属性获取方式的函数。 需要有一个能够检索属性的函数(如果定义了任何属性)还要有另一个函数负责设置属性(如果允许设置属性)。 移除属性是一种特殊情况,在此情况下要传给处理句柄的新值为 NULL。
Python 支持两对属性处理句柄;一个支持属性操作的类型只需要实现其中一对的函数。 两者的差别在于一对接受 char* 作为属性名称,而另一对则接受 PyObject*。 每种类型都可以选择使用对于实现的便利性来说更有意义的那一对。
getattrfunc tp_getattr; /* char * version */
setattrfunc tp_setattr;
/* ... */
getattrofunc tp_getattro; /* PyObject * version */
setattrofunc tp_setattro;
如果访问一个对象的属性总是为简单操作(这将在下文进行解释),则有一些泛用实现可被用来提供 PyObject* 版本的属性管理函数。 从 Python 2.2 开始对于类型专属的属性处理句柄的实际需要几乎已完全消失,尽管还存在着许多尚未理新为使用某种新的可选泛用机制的例子。 |