繁体   English   中英

具有旧式类的Python描述符

[英]Python descriptors with old-style classes

我试图谷歌一些关于它的东西。 为什么非数据描述符适用于旧式类?

文件说他们不应该:
请注意,仅对新样式对象或类(子类object()type() )调用描述符。

class Descriptor(object):
    def __init__(self):
        self.x = 1

    def __get__(self, obj, cls=None):
        return self.x


class A:
    x = Descriptor()

a = A()
a.x

>>> 1

谢谢。

您对文档提出质疑是正确的。 我试过通过CPython来源查找解释,但要注意:我不是专家。

根据我的理解,属性查找和描述符__get__调用发生在instance_getattr2 (选择的提取)中:

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));
    }
}

所以要么我缺少一些东西,要么实现中没有任何东西需要一个新式的对象(这与文档相矛盾)。

为了记录,我尝试重新编译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>>

因此, 似乎防止对旧式对象或类的属性进行描述符调用也会阻止对它们的方法调用 ,至少在CPython实现方面是这样。

再一次,我不是专家,这是我第一次深入Python实现,所以我很可能是错的。 我提出了一个问题 ,试图澄清这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM