使用旧式类的Python描述符

使用旧式类的Python描述符,python,class,descriptor,Python,Class,Descriptor,我试着用谷歌搜索一下。为什么非数据描述符与旧式类一起工作 医生说他们不应该: “” 谢谢。您对文档的质疑是对的。我试着寻找一个解释,但请注意:我不是专家 据我所知,属性查找和描述符\uuuuuuu get\uuuuu调用发生在(所选摘录): 因此,要么我遗漏了一些东西,要么实现中没有任何东西需要新样式的对象(这与文档相矛盾) 为了记录在案,我尝试重新编译Python以限制对新样式类对象的描述符调用,但它实际上带来了巨大的混乱。在这个过程中,我了解到类方法本身是作为描述符实现的:这是根据用法返回绑

我试着用谷歌搜索一下。为什么非数据描述符与旧式类一起工作

医生说他们不应该:
“”


谢谢。

您对文档的质疑是对的。我试着寻找一个解释,但请注意:我不是专家

据我所知,属性查找和描述符
\uuuuuuu get\uuuuu
调用发生在(所选摘录):

因此,要么我遗漏了一些东西,要么实现中没有任何东西需要新样式的对象(这与文档相矛盾)

为了记录在案,我尝试重新编译Python以限制对新样式类对象的描述符调用,但它实际上带来了巨大的混乱。在这个过程中,我了解到类方法本身是作为描述符实现的:这是根据用法返回绑定或未绑定方法对象的机制。例如:

>>> class A:
...     def foo():
...         pass
...
>>> A.foo.__get__(None, A)
<unbound method A.foo>
>>> A.foo.__get__(A(), A)
<bound method A.foo of <__main__.A instance at 0x000000000229CC48>>
>>A类:
...     def foo():
...         通过
...
>>>A.foo.\uuuuuuuuuuuuuuuuu(无,A)
>>>A.foo.\uuuuu获取\uuuuu(A(),A)
因此,防止对旧式对象或类的属性调用描述符似乎也会阻止对它们的方法调用,至少在CPython实现中是这样


再一次,我不是专家,这是我第一次深入研究Python实现,所以我很可能是错的。我已经提交文件试图澄清这一点。

因为“描述符”是一个新型类。感谢您的调查,它真的很有帮助。我在CPython的调试会话后编辑了我的答案:我使用了错误的函数,但结果保持不变。在Python中,所有函数(包括方法)都是非数据描述符。所以他们应该像你说的那样。但我还有一个问题。如果
描述符
是旧式类,为什么
\uuuuu get\uuuu
不起作用?我认为,如果旧样式(或新样式)类的属性或方法是
对象
(所有函数都是)的子实例,那么试图执行
\uuuuuu get\uuuu
的解释器将消失。它们只是类的函数属性@alexvassel我认为限制不在使用描述符的类上(在您的示例中为
A
),而是在实现描述符的类上(
descriptor
)。如果
Descriptor
是一个旧式类,那么
\uuuu get/set/del\uuu
不被视为特殊方法,因此它们不会被调用。当
描述符
类继承
对象
时,这些方法被认为是特殊的。
v = class_lookup(inst->in_class, name, &klass);
if (v != NULL) {
    f = TP_DESCR_GET(v->ob_type);
    if (f != NULL) {
        PyObject *w = f(v, (PyObject *)inst, (PyObject *)(inst->in_class));
    }
}
>>> class A:
...     def foo():
...         pass
...
>>> A.foo.__get__(None, A)
<unbound method A.foo>
>>> A.foo.__get__(A(), A)
<bound method A.foo of <__main__.A instance at 0x000000000229CC48>>