wrap_descr_get
无法包裹
slot_tp_descr_get
.
slot_tp_desc_get
这只是一种可能的实现方式
tp_descr_get
插槽,而且从来都不是那个
wrap_descr_get
看到。
A.
slot_*
函数和包装描述符永远不会用于同一类型的同一插槽。
插槽_*
当类型在Python中实现方法时,函数用于提供与Python方法对应的C槽实现。每个插槽对应一个Python方法。
slot_tp_desc_get
是用于为以下对象提供C插槽实现的函数
tp_descr_get
当一个类实现时
__get__
在Python中。这是进入
tp_descr_get
类的插槽如下:
class Example:
def __get__(self, instance, owner=None):
...
当被呼叫时,
slot_tp_desc_get
将查找
__得到__
方法并调用它。
包装描述符用于执行相反方向的包装。当一个类型直接实现C槽时,它们为与C槽对应的Python方法提供了一个实现。
包装描述符是以下的实例
types.WrapperDescriptorType
。该类型在中实现
Objects/descrobject.c
,以及其他几种描述符类型。
包装描述符需要一种方法,将传入的Python级调用转换为它们包装的任何插槽所采用的参数格式。对于包装一个
tp_descr_get
函数,它们翻译调用的方式是
wrap_descr_get
.
包装描述符类型也恰好有自己的
tp_descr_get
功能,
wrapperdescr_get
,用于为包装描述符表示的任何方法生成绑定方法对象。这与包装器描述符包装的插槽是分开的,即使该插槽是
tp_descr_get
狭槽。
因此,对于实现的类型
__得到__
在Python中,C槽函数将被设置为
slot_tp_desc_get
,以及
slot_tp_desc_get
将委托给
__得到__
.对于实现的类型
tp_descr_get
在C中,将生成一个包装描述符来实现
__得到__
,包装描述符将使用
wrap_descr_get
拨打电话
tp_descr_get
.
在任何情况下都不会
slot_tp_desc_get
和
wrap_descr_get
最终递归地相互委派。