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

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

Nov 14, 2024 pm 02:39 PM

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

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何在使用 Fiddler Everywhere 进行中间人读取时避免被浏览器检测到? 如何在使用 Fiddler Everywhere 进行中间人读取时避免被浏览器检测到? Apr 02, 2025 am 07:15 AM

使用FiddlerEverywhere进行中间人读取时如何避免被检测到当你使用FiddlerEverywhere...

在Linux终端中使用python --version命令时如何解决权限问题? 在Linux终端中使用python --version命令时如何解决权限问题? Apr 02, 2025 am 06:36 AM

Linux终端中使用python...

如何在10小时内通过项目和问题驱动的方式教计算机小白编程基础? 如何在10小时内通过项目和问题驱动的方式教计算机小白编程基础? Apr 02, 2025 am 07:18 AM

如何在10小时内教计算机小白编程基础?如果你只有10个小时来教计算机小白一些编程知识,你会选择教些什么�...

如何绕过Investing.com的反爬虫机制获取新闻数据? 如何绕过Investing.com的反爬虫机制获取新闻数据? Apr 02, 2025 am 07:03 AM

攻克Investing.com的反爬虫策略许多人尝试爬取Investing.com(https://cn.investing.com/news/latest-news)的新闻数据时,常常�...

Python 3.6加载pickle文件报错ModuleNotFoundError: No module named '__builtin__'怎么办? Python 3.6加载pickle文件报错ModuleNotFoundError: No module named '__builtin__'怎么办? Apr 02, 2025 am 06:27 AM

Python3.6环境下加载pickle文件报错:ModuleNotFoundError:Nomodulenamed...

使用Scapy爬虫时,管道文件无法写入的原因是什么? 使用Scapy爬虫时,管道文件无法写入的原因是什么? Apr 02, 2025 am 06:45 AM

使用Scapy爬虫时管道文件无法写入的原因探讨在学习和使用Scapy爬虫进行数据持久化存储时,可能会遇到管道文�...

See all articles