在属性解析期间,如果每个属性都存在于类中,Python是否会检查?如果是这样,它不会产生很大的开销吗?
例如,检查属性a.x
。 Python必须首先检查A.__dict__["x"]
是否是数据描述符(因为它们会覆盖正常的属性查找),这意味着它应检查整个__mro__
的数据描述符。
这反过来意味着实例中的每个属性查找都会在整个类mro中进行查找,这听起来像是一个巨大的开销。这是缓存的吗?即使它是,通过动态添加数据描述符,什么阻止修改其中一个基类?这个理论缓存将如何失效?
答案 0 :(得分:0)
该类已负责处理属性查找。但是,是的,要查找属性,请查询当前类和基类,因为该属性可能是数据描述符。
这是因为某些对象是特殊,因为它们可以绑定到实例或类(descriptor,和,它们是& #39;如果它们是 data 描述符(支持设置或删除值的描述符),则覆盖实例上具有相同名称的任何属性。
所有这些都是在类__getattribute__
method的C实现中处理的(通常继承自object.__getattribute__)
,而在C中,对实例和类命名空间的访问相对便宜。< / p>
有关如何以及为何这样做的详细信息,请参阅Descriptor HOWTO。