如何解决为什么在hassattr内部调用Python中描述符的__get__方法?
假设
class D:
def __init__(self,id): self.id = id
def __get__(self,obj,type=None):
print(self.id,"__get__ is called")
class C:
d1 = D(1)
d2 = D(2)
d3 = D(3)
c = C()
然后在调用hasattr(c,"d1")
期间调用__get__
的{{1}}方法。为什么? C.d1
不应该只检查字典吗?
在交互式cpython-version-3.6.10会话中按下hasattr()
以完成操作时,会发生相同(但很奇怪)的情况,与<tab>
中一样。在这种情况下,将为除最后一个属性之外的所有匹配属性调用c.d<tab>
。
这是怎么回事?
解决方法
如果您在help
(或documentation)中查看hasattr
:
Help on built-in function hasattr in module builtins:
hasattr(obj,name,/)
Return whether the object has an attribute with the given name.
This is done by calling getattr(obj,name) and catching AttributeError.
所以不,它不仅会“检查字典”,而且不能这样做,因为并非所有对象都将字典作为名称空间开头,例如内置对象或带有__slots__
的用户定义对象。
getattr(obj,name)
将正确调用等效的机器,如下:
obj.name
哪个会调用描述符的__get__
不确定制表符是否完成,但是hasattr
会调用__get__
。是documented as well:
参数是一个对象和一个字符串。如果结果为
True
, string是对象属性之一的名称,如果不是False
。 (这是通过调用getattr(object,name)
并看到 是否引发AttributeError
。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。