为什么属性必须是Python中的类属性?

时间:2017-03-31 18:56:48

标签: python python-3.x properties descriptor

最近,我一直在学习Python中的托管属性,以及具有属性和描述符的共同主题,它们必须被指定为类属性。但是我无处可以找到解释为什么,特别是为什么它们不能被指定为实例属性的解释。所以我的问题实际上有两个部分:

  • 为什么属性/描述符实例必须是类属性?
  • 为什么属性/描述符实例不是实例属性?

2 个答案:

答案 0 :(得分:3)

这是因为Python尝试解析属性的方式:

  1. 首先检查它是否在班级定义
  2. 如果是,则检查它是属性还是数据描述符
  3. 如果是,则遵循此"路径"
  4. 如果不是,它会检查它是否是一个简单的类变量(如果有的话,是否为其父类)
  5. 如果是,则检查实例是否覆盖此类属性值,如果是,则返回overriden值,如果不是则返回类属性值
  6. 如果不是,则检查实例是否声明了此属性
  7. 如果是,则返回实例属性值
  8. 如果不是,则抛出AttributeError
  9. Voila; - )

    修改

    我刚发现this link比我更好地解释了它。

    另一个不错的illustration

答案 1 :(得分:0)

  

为什么属性/描述符实例必须是类属性?

他们不会拥有,他们就是。这是一个设计决策,可能有更多的理由来支持它(简化实现,将类与对象分离)。

  

为什么属性/描述符实例不能是实例属性?

它们可以是,您可以始终覆盖__getattribute__,以便调用在实例上访问的任何描述符,或者如果您愿意,可以完全禁止它们。

请记住,Python不会阻止你这样做并不意味着它是一个好主意。