Python描述符';s-文件不清楚

Python描述符';s-文件不清楚,python,namespaces,descriptor,Python,Namespaces,Descriptor,我正在看python的描述符文档,让我思考的语句是: 对于对象,机器位于对象中。将b.x转换为类型(b)。\uu dict\uuu['x'].\uu get\uuu(b,类型(b)) 在一个名为 语句的最后一部分b.x转换为类型(b)。\uuuuu dict\uuuuu['x']。\uuuu get\uuuuuu(b,类型(b))导致了这里的冲突。根据我的理解,如果我们在一个实例上查找属性,那么就会查找instance.\uuu dict\uuu,如果我们没有找到任何type(instanc

我正在看python的描述符文档,让我思考的语句是:


对于对象,机器位于
对象中。
b.x
转换为
类型(b)。\uu dict\uuu['x'].\uu get\uuu(b,类型(b))


在一个名为

语句的最后一部分
b.x转换为类型(b)。\uuuuu dict\uuuuu['x']。\uuuu get\uuuuuu(b,类型(b))
导致了这里的冲突。根据我的理解,如果我们在一个实例上查找属性,那么就会查找
instance.\uuu dict\uuu
,如果我们没有找到任何
type(instance)。\uu dict\uu

在我们的示例中,
b.x
应评估为:

b.\uuuu dict\uuuu[“x”]。\uuuu get\uuuu(b,键入(b))
而不是

类型(b)。\uuuuu dict\uuuuuuuuux'.\uuuu get\uuuuuuuuuuuub,类型(b))

这种理解正确吗?还是我在口译方面出了什么差错? 任何解释都会有帮助

谢谢

我还要补充第二部分:

为什么实例属性不遵守描述符协议?例如:参考以下代码:

>>> 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>
>>类描述(对象):
...     定义获取(自身、对象、类型):
...         返回1000
...     定义设置(自身、对象、值):
...         提高属性错误
... 
>>> 
>>>类别测试(对象):
...     定义初始化(self,num):
...         self.num=num
...         self.desc=desc()
... 
>>> 
>>>t=试验(10)
>>>打印“描述详情”,t.Desc
详细说明如下:

谢谢你帮助我。

你的理解是错误的
x
很可能根本不出现在实例的dict中;描述符对象出现在类的dict或其中一个超类的dict中

让我们举一个例子:

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.x
Foo.y
都是描述符。(属性和函数都实现描述符协议。)

当我们访问
x.x
时:

>>> x.x
0
我们不从
x
的dict中获取值。相反,由于Python在
Foo中找到一个名为
x
的数据描述符

Foo.__dict__['x'].__get__(x, Foo)
并返回结果。数据描述符胜过实例dict

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

>>> x.y
3
我们得到3,而不是一个绑定方法对象。函数没有
\uuuuuuu set\uuuuuu
\uuuu delete\uuuuuuuuu
,因此实例dict会覆盖它们


对于你的问题的新的第2部分,描述符在实例DICT中不起作用。考虑如果他们这样做会发生什么:

class Foo(object):
    @property
    def bar(self):
        return 4

Foo.bar = 3

如果描述符在实例dict中起作用,那么对
Foo.bar
的赋值将在
Foo
的dict中找到一个描述符,并调用
Foo.\uuuuu dict.\uuuu['bar'.\uuu设置\uuu
。描述符的
\uuuuuuuuuuu\uuuuuu
方法必须处理类和实例上的属性设置,并且它必须以某种方式分辨差异,即使面对元类也是如此。没有令人信服的理由这样使协议复杂化。

你的理解是错误的
x
很可能根本不出现在实例的dict中;描述符对象出现在类的dict或其中一个超类的dict中

让我们举一个例子:

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.x
Foo.y
都是描述符。(属性和函数都实现描述符协议。)

当我们访问
x.x
时:

>>> x.x
0
我们不从
x
的dict中获取值。相反,由于Python在
Foo中找到一个名为
x
的数据描述符

Foo.__dict__['x'].__get__(x, Foo)
并返回结果。数据描述符胜过实例dict

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

>>> x.y
3
我们得到3,而不是一个绑定方法对象。函数没有
\uuuuuuu set\uuuuuu
\uuuu delete\uuuuuuuuu
,因此实例dict会覆盖它们


对于你的问题的新的第2部分,描述符在实例DICT中不起作用。考虑如果他们这样做会发生什么:

class Foo(object):
    @property
    def bar(self):
        return 4

Foo.bar = 3

如果描述符在实例dict中起作用,那么对
Foo.bar
的赋值将在
Foo
的dict中找到一个描述符,并调用
Foo.\uuuuu dict.\uuuu['bar'.\uuu设置\uuu
。描述符的
\uuuuuuuuuuu\uuuuuu
方法必须处理类和实例上的属性设置,并且它必须以某种方式分辨差异,即使面对元类也是如此。没有令人信服的理由这样使协议复杂化。

你的理解是错误的
x
很可能根本不出现在实例的dict中;描述符对象出现在类的dict或其中一个超类的dict中

让我们举一个例子:

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.x
Foo.y
都是描述符。(属性和函数都实现描述符协议。)

当我们访问
x.x
时:

>>> x.x
0
我们不从
x
的dict中获取值。相反,由于Python在
Foo中找到一个名为
x
的数据描述符

Foo.__dict__['x'].__get__(x, Foo)
并返回结果。数据描述符胜过实例dict

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

>>> x.y
3
我们得到3,而不是一个绑定方法对象。函数没有
\uuuuuuu set\uuuuuu
\uuuu delete\uuuuuuuuu
,因此实例dict会覆盖它们


对于你的问题的新的第2部分,描述符在实例DICT中不起作用。考虑如果他们这样做会发生什么:

class Foo(object):
    @property
    def bar(self):
        return 4

Foo.bar = 3
如果描述符在实例dict中起作用,那么对
Foo.bar
的赋值将在
Foo
的dict中找到一个描述符,并调用
Foo.\uuuuu dict.\uuuu['bar'.\uuu设置\uuu
。描述符的
\uuuuuuuuuu\uuuuuuu
方法必须处理类和实例上的属性设置,并且必须