Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
被python描述符和_uget__;()弄糊涂了_Python_Descriptor - Fatal编程技术网

被python描述符和_uget__;()弄糊涂了

被python描述符和_uget__;()弄糊涂了,python,descriptor,Python,Descriptor,这是一个简单的类,我只想测试一下\uuu get\uuuu() 代码是: class Des(object): def __init__(self,num): self.num = num def __get__(self, obj, typ = None): return self.num class A(object): des = Des(1) print 'the des in class is ',des a = A(

这是一个简单的类,我只想测试一下
\uuu get\uuuu()
代码是:

class Des(object):
    def __init__(self,num):
        self.num = num
    def __get__(self, obj, typ = None):
        return self.num

class A(object):
    des = Des(1)
    print 'the des in class is ',des

a = A()
print  'the des in object is ',a.des
print a.__dict__
print A.__dict__
输出为:

the des in class is  <Des object at 0x7f5fb550ded0>
the des in object is  1
{}
{'__dict__': <attribute '__dict__' of 'A' objects>, '__module__': '__builtin__', 'des': <Des object at 0x7f5fb550ded0>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}
类中的des是
对象中的des为1
{}
{uuuu dict:,'uuuu module:'uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
我的问题是为什么
des
的输出是
des
是不同的(一个是1
type(int)
,一个是object
type(des)
)。而
a.uu dict_uu
a.u dict
的输出也不同。
\uu get\uu()
的功能是什么,以及如何使用它

为什么des的输出不同(一个是1类型(int),一个是对象类型(des))

在第一种情况下,将在
A
class语句的主体中打印
Des
的实例。在这一点上,它只是一个普通的Python对象-没有涉及描述符协议,因为您没有对类或实例进行属性访问,因为
a
类甚至还不存在-所以您得到了
Des
对象的默认表示

在第二种情况下,在
A
的实例上查找(属性访问)名称
des
。属性解析机制(在
对象中实现.\uuuuu getattribute\uuuuuu
)在
A中查找名称
des.\uu dict\uuuuu
,并查找相关对象实现
\uuu get\uuuuuuu
,因此它调用
A.\uu dict\uuuu[“des”.\uu get\uuuu(A,A)
,并返回结果-在本例中是A.dict,即
int(1)`

a.uu dict_u
a.u dict_u
的输出也不同

当然可以
A.。\uuuu dict\uuuuu
是类
A
的dict,
A.\uuu dict\uuuuu
是实例
A
的dict。为什么你会期望同一个人分享同一份口述

\uu get\uu()
的功能是什么,以及如何使用它


Martijn Pieters的链接将回答这个问题。

在您的代码中,
des
是一个类属性,在描述符中它(class attr)将调用
get()
,在下一个
a.des
调用
调用
方法,这就是您得到不同输出的原因(在您的示例输出中).

你是从哪里想到
\uuuu get\uuuu
与属性和
\uu dict\uuuu
有关的?它是描述符协议的一部分;绑定方法和属性。您对描述符了解多少?我在这里有帮助吗?也许在这里也是相关的。尝试
a=a()
a=a
-->然后它会给出相同的答案。这种情况的发生是因为您尝试分配类a方法,但在
类a
中没有任何其他方法,所以如果您想要相同的答案,那么在分配时删除
()
谢谢您的答案,这对我帮助很大,解决了我的大部分困惑。@ArthurGeorge然后可以自由投票并接受它。谢谢你的回答,这对我帮助很大,解决了我的大部分困惑。但我还有一些问题。首先,python解释器如何知道调用。我认为它将检查关联对象(Des)是否实现了get方法。没错,亚瑟王你知道你可以编辑你的问题,是吗?是的,正如我在回答中已经提到的,
对象。
(不是“python解释器”)将检查是否有类属性实现了
\uuuu get\uuu
,如本文所述