假设我们要获取一个对象的属性:smth = object.attr
。还假设我们已经知道我们的属性位于哪个对象中,假设它是名为 A 的类。
据我所知,属性获取过程如下所示:
attr = A.__dict__['attr'] # 1
if hasattr(attr, '__get__'): # 2
return attr.__get__(None, A)
else:
return attr
- 在 A 类的属性字典中找到描述符。
- 如果存在,则返回属性的 getter 的输出。否则,返回属性本身。
我在这里看到一个问题。假设我们的属性是一个带有 getter 的描述符。在这种情况下,要解析object.descriptor
,我们必须解析descriptor.__get__
哪个是非数据描述符(函数),也需要解析。这个递归的终点在哪里?