Python属性分辨率开销

时间:2018-01-27 16:04:20

标签: python python-3.x attributes method-resolution-order

在属性解析期间,如果每个属性都存在于类中,Python是否会检查?如果是这样,它不会产生很大的开销吗?

例如,检查属性a.x。 Python必须首先检查A.__dict__["x"]是否是数据描述符(因为它们会覆盖正常的属性查找),这意味着它应检查整个__mro__的数据描述符。 这反过来意味着实例中的每个属性查找都会在整个类mro中进行查找,这听起来像是一个巨大的开销。这是缓存的吗?即使它是,通过动态添加数据描述符,什么阻止修改其中一个基类?这个理论缓存将如何失效?

1 个答案:

答案 0 :(得分:0)

该类已负责处理属性查找。但是,是的,要查找属性,请查询当前类和基类,因为该属性可能是数据描述符。

这是因为某些对象是特殊,因为它们可以绑定到实例或类(descriptor,它们是& #39;如果它们是 data 描述符(支持设置或删除值的描述符),则覆盖实例上具有相同名称的任何属性。

所有这些都是在类__getattribute__ method的C实现中处理的(通常继承自object.__getattribute__),而在C中,对实例和类命名空间的访问相对便宜。< / p>

有关如何以及为何这样做的详细信息,请参阅Descriptor HOWTO