尝试将属性分配给普通对象实例(如 o.attr = 'hello')时,会引发 AttributeError ,表明该对象缺少指定的属性。但是,对于从 object 继承的类(例如 Sub)来说,这不是问题,它可以分配 s.attr = 'hello' 等属性。为什么会这样,需要了解Python的内部基础结构。
为了支持动态属性赋值,对象必须有一个 __dict__ ,它作为一个字典,可以存储任意属性可以存储。如果没有 __dict__,就没有可用于新属性的存储。
对象的实例没有 __dict__。在对象定义中包含一个会导致循环依赖问题,因为 dict 也是从 object 继承的。此外,为每个对象分配 __dict__ 会给不需要动态属性分配的对象带来不必要的内存开销。
创建继承自 object 的类时,情况发生变化。类实例的创建会触发 __dict__ 的分配。这允许对象的子类拥有动态属性分配功能,但会增加与灵活性相关的内存成本。
Python 提供了一种优化__slots__ 技术,用于限制可以分配给对象的属性。通过在 __slots__ 属性中指定字符串名称序列,该类指示 Python 不要创建 __dict__ 而是仅分配指定的属性槽。这种方法减少了内存开销,并且在对象具有一组固定属性的情况下非常有用。
总而言之,无法为对象实例分配属性源于缺少 __dict__,这会引入内存开销对于没有动态属性分配功能的对象。然而,类实例拥有 __dict__ 并且可以动态分配属性。 __slots__ 属性通过将属性分配限制为固定集来提供内存优化选项。
以上是为什么我无法在 Python 中修改 Vanilla 对象实例的属性?的详细内容。更多信息请关注PHP中文网其他相关文章!