被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
是不同的(一个是1type(int)
,一个是objecttype(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
,如本文所述