描述符和虚线查找

描述符是(通常)类的属性并且具有 __get____set____delete__ 特殊方法的任何对象。

数据描述符包含 __set____delete__ 中的任何一个

这些可以控制实例上的虚线查找,并用于实现函数 staticmethodclassmethodproperty。点查找(例如,类 Foo 查找属性 bar 的实例 foo - 即 foo.bar)使用以下算法:

  1. Foo 在课堂上被抬起来了。如果它在那里并且它是数据描述符,则使用数据描述符。这就是 property 如何能够控制对实例中数据的访问,而实例无法覆盖它。如果没有数据描述符那么

  2. 在实例 __dict__ 中查找了 bar。这就是我们可以使用虚线查找覆盖或阻止从实例调用的方法的原因。如果实例中存在 bar,则使用它。如果没有,我们那么

  3. 在课堂上看看 Foo for bar。如果它是描述符,则使用描述符协议。这是函数(在此上下文中,未绑定方法),classmethodstaticmethod 的实现方式。否则它只是返回那里的对象,或者有一个 AttributeError