gpt4 book ai didi

具有旧式类的 Python 描述符

转载 作者:太空狗 更新时间:2023-10-30 00:07:41 26 4
gpt4 key购买 nike

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

文档说他们不应该:
Note that descriptors are only invoked for new style objects or classes (ones that subclass object() or 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 sources寻找解释,但请注意:我不是专家。

据我了解,属性查找和描述符 __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 以限制对新样式类对象的描述符调用,但它实际上带来了巨大的困惑。我在这个过程中了解到类方法本身是作为描述符实现的:这是用于根据用途返回绑定(bind)或未绑定(bind)方法对象的机制。例如:

>>> 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 实现,所以我很可能是错的。我已经提交了 an issue试图澄清这一点。

关于具有旧式类的 Python 描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16712002/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com