首页 >后端开发 >Python教程 >为什么不能在 Python 中为普通对象分配属性?

为什么不能在 Python 中为普通对象分配属性?

DDD
DDD原创
2024-11-14 14:39:011042浏览

Why can't you assign attributes to vanilla objects in Python?

在 Python 中设置对象的属性:了解限制

在 Python 中,可以在从对象类,但不直接在对象类本身的实例上。这种区别提出了一个问题:为什么禁止普通对象分配属性?

对象实例中缺少字典

为了支持任意属性分配,对象需要一个 dict 属性,它充当可以存储属性的字典。然而,对象类的实例不拥有这样的 dict__。在 Python 中为每个对象创建 __dict 会带来巨大的内存开销,因为所有对象都需要存在它,即使是那些不使用属性的对象。

这可以使用 pympler 进行演示项目。大小测量表明,字典(可以保存属性的对象)消耗 144 个字节,而整数(没有属性的对象)仅需要 16 个字节。通过引入 __dict__,即使是简单的对象的内存占用也会大大增加。

继承和属性赋值

当创建一个继承自对象类的类时,情况发生变化。 dict 属性被添加到新类的每个实例中,允许它具有任意属性。然而,这种灵活性是有存储成本的。

例如,创建一个继承自 int 的名为 dint 的类会导致实例占用 184 字节,明显高于常规整数的 16 字节。这种差异是由于附加的 dict 属性造成的。

slots 替代方案

在实例仅需要对于少量的特定属性,Python 提供了 slots 特殊属性。通过将 slots 定义为包含属性名称的字符串序列,类可以限制实例可以拥有的属性集。这种机制可以防止创建 __dict__,从而节省内存。

例如,创建一个名为 fint 的类,该类继承自 int 并定义一个名为“foobar”的属性槽,从而将实例的内存占用量减少到 80 字节。这仍然大于整数,但明显小于具有 __dict__ 的类。

结论

总之,Python 中的普通对象不能分配属性,因为它们不具有 dict 属性。这样做主要是为了节省内存,因为每个对象都需要 dict,无论它是否需要属性。然而,继承的类可以通过包含 dict 来拥有属性,并且 slots 机制在需要有限数量的特定属性时提供了一种有效的替代方案。

以上是为什么不能在 Python 中为普通对象分配属性?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn