gpt4 book ai didi

Python 描述符 - 文档不清楚

转载 作者:行者123 更新时间:2023-12-04 16:59:22 26 4
gpt4 key购买 nike

我正在查看 python 的描述 rune 档 here ,让我思考的陈述是:

对于物体,机械在 object.__getattribute__()转换 b.x进入 type(b).__dict__['x'].__get__(b, type(b))
在名为 Invoking Descriptors 的部分下.

声明的最后部分 b.x into type(b).__dict__['x'].__get__(b, type(b))正在引起这里的冲突。根据我的理解,如果我们在一个实例上查找属性,那么 instance.__dict__正在查找,如果我们没有找到任何东西 type(instance).__dict__被引用。

在我们的示例中,b.x然后应评估为:
b.__dict__["x"].__get__(b, type(b)) 而不是
type(b).__dict__['x'].__get__(b, type(b))
这种理解是否正确?或者我在解释的某个地方出错了?
任何解释都会有所帮助。

谢谢。

我还要添加第二部分:

为什么实例属性不遵守描述符协议(protocol)?例如:引用下面的代码:

>>> class Desc(object):
... def __get__(self, obj, type):
... return 1000
... def __set__(self, obj, value):
... raise AttributeError
...
>>>
>>> class Test(object):
... def __init__(self,num):
... self.num = num
... self.desc = Desc()
...
>>>
>>> t = Test(10)
>>> print "Desc details are ", t.desc
Desc details are <__main__.Desc object at 0x7f746d647890>

谢谢你的协助。

最佳答案

你的理解是错误的。 x很可能根本没有出现在实例的字典中;描述符对象出现在类的字典或父类(super class)之一的字典中。

让我们举一个例子:

class Foo(object):
@property
def x(self):
return 0

def y(self):
return 1

x = Foo()
x.__dict__['x'] = 2
x.__dict__['y'] = 3
Foo.xFoo.y都是描述符。 (属性和函数都实现了描述符协议(protocol)。)

当我们访问 x.x :
>>> x.x
0

我们没有从 x 得到值的命令。相反,因为 Python 找到了名称为 x 的数据描述符。在 Foo.__dict__ ,它调用
Foo.__dict__['x'].__get__(x, Foo)

并返回结果。数据描述符胜过实例字典。

另一方面,如果我们尝试 x.y :
>>> x.y
3

我们得到 3,而不是绑定(bind)的方法对象。函数没有 __set____delete__ ,所以实例 dict 会覆盖它们。

至于您的问题的新第 2 部分,描述符在实例字典中不起作用。考虑一下如果他们这样做会发生什么:
class Foo(object):
@property
def bar(self):
return 4

Foo.bar = 3

如果描述符在实例字典中起作用,则分配给 Foo.bar会在 Foo 中找到一个描述符的字典和电话 Foo.__dict__['bar'].__set__ . __set__描述符的方法必须处理在类和实例上设置属性,并且它必须以某种方式区分差异,即使面对元类也是如此。以这种方式使协议(protocol)复杂化并没有令人信服的理由。

关于Python 描述符 - 文档不清楚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21573967/

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