Python描述符';s-文件不清楚
我正在看python的描述符文档,让我思考的语句是: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
对于对象,机器位于
对象中。
将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
方法必须处理类和实例上的属性设置,并且必须