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

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

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

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

  • 首先它会检查它是否在课堂级定义
  • 如果是,它会检查它是属性还是数据描述符
  • 如果是的话,它遵循这个“路径”
  • 如果不是,它会检查它是否是一个简单的类变量(直到它的父类,如果有的话)
  • 如果是,则检查实例是否覆盖此类属性值,如果是,则返回覆盖值,否则返回类属性值
  • 如果否,它会检查实例是否声明了此属性
  • 如果是,则返回实例属性值
  • 如果不是,则抛出AttributeError
  • Voila ;-)

    编辑

    我只是发现这个链接,它比我更好地解释它。

    另一个很好的例子


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

    他们不必是,他们只是。 这是一个设计决策,可能有比我想象的更多的支持理由(简化实现,将类与对象分离)。

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

    他们可能是,你总是可以覆盖__getattribute__来调用实例上访问的任何描述符,或者如果你愿意,可以完全禁止它们。

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

    链接地址: http://www.djcxy.com/p/38815.html

    上一篇: Why do properties have to be class attributes in Python?

    下一篇: How does {...object, property: value} work with spread syntax?