首页 > 编程语言 >Python __dict__属性:查看对象内部所有属性名和属性值组成的字典

Python __dict__属性:查看对象内部所有属性名和属性值组成的字典

时间:2024-11-14 17:45:09浏览次数:3  
标签:__ obj Python self dict slots 属性

在Python中,每个对象都有一个__dict__属性,这个属性是一个字典,用于存储对象的属性和对应的值。对于自定义的类实例和大多数内置对象类型,你都可以通过访问__dict__属性来查看对象内部的所有属性名和属性值。

以下是一些示例,展示了如何使用__dict__属性:

示例1:自定义类实例

class MyClass:  
    def __init__(self, a, b):  
        self.a = a  
        self.b = b  
  
obj = MyClass(1, 2)  
print(obj.__dict__)

输出:

{'a': 1, 'b': 2}

示例2:内置对象类型
对于内置对象类型,比如字典和列表,它们也有__dict__属性(不过某些简单类型如整数和字符串则没有)。

my_dict = {'key1': 'value1', 'key2': 'value2'}  
print(my_dict.__dict__)

需要注意的是,某些内置类型如dict、list、set和tuple在CPython实现中,它们的__dict__属性是空的,因为它们使用更高效的内部数据结构来存储元素,而不是普通的Python字典。但是,自定义的子类会继承这个__dict__属性。

class MyDict(dict):  
    pass  
  
my_custom_dict = MyDict(a=1, b=2)  
print(my_custom_dict.__dict__)

输出(注意:字典本身的内容不会出现在__dict__中,只有类的属性会):

{}

(在这种情况下,因为MyDict没有定义额外的实例属性,所以__dict__是空的。如果定义了额外的属性,它们会出现在这里。)

示例3:动态添加属性
你还可以动态地给对象添加属性,并通过__dict__查看这些属性。

obj = MyClass(1, 2)  
obj.c = 3  
print(obj.__dict__)

输出:

{'a': 1, 'b': 2, 'c': 3}

注意事项
不要依赖__dict__进行序列化:虽然__dict__可以用于调试和检查对象的状态,但不应该依赖它来进行对象的序列化。应该使用适当的序列化方法,如pickle模块或JSON(对于简单的数据结构)。
私有属性:如果类中定义了私有属性(即名称以双下划线开头的属性),它们会经过名称改编(name mangling),因此不会直接出现在__dict__中,而是以改编后的名称出现。
slots:如果类使用了__slots__来限制实例属性,那么该类的实例将不会有__dict__属性。

class MyClassWithSlots:  
    __slots__ = ['a', 'b']  
  
    def __init__(self, a, b):  
        self.a = a  
        self.b = b  
  
obj_with_slots = MyClassWithSlots(1, 2)  
# print(obj_with_slots.__dict__)  # 这将引发AttributeError

在这个例子中,尝试访问obj_with_slots.dict__会引发AttributeError,因为该类使用了__slots

总之,__dict__属性是一个非常有用的调试工具,但在生产代码中应谨慎使用。

标签:__,obj,Python,self,dict,slots,属性
From: https://blog.csdn.net/m0_65482549/article/details/143777183

相关文章

  • 基于nodejs+vue资产管理[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景在资产管理领域,国内外已有的研究多集中在宏观的资产配置策略以及大型企业的资产管理模式等方面1。例如,国外在金融资产的量化管理方面取得了诸多成果,通过......
  • 2024.11.14随笔&联考总结
    前言今天联考直接炸纲了。但是不得不说:HEZ的题要比BSZX好多了。联考今天联考题说实话难度应该比较适合我。第一题是推结论的题,我赛时20min想出正解,但是有两个细节没有考虑清楚,导致后来调题调了一个多小时,然后经典开警告但是不看秒了,期望得分100pts,实际0pts。原因bool......
  • 你的WAF是否真的安全?雷池社区版的安全能力测试
    你的WAF能力如何?雷池社区版的安全能力测试最近雷池社区版很火,各大技术群都在讨论什么是雷池?引用官网文档的一段话:SafeLine,中文名 "雷池",是一款简单好用, 效果突出的 Web 应用防火墙(WAF),可以保护 Web 服务不受黑客攻击。雷池通过过滤和监控 Web 应用与互联网之间的 ......
  • 基于nodejs+vue卓越导师双选系统[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于导师与学员双选系统的研究,现有研究主要以传统的人工双选模式为主,专门针对卓越导师双选系统的研究较少。在国内外的教育与人才培养领域,传统双选方式......
  • echarts自定义tooltip
    tooltip配置tooltip:{show:true,trigger:'axis',formatter:params=>{letresult=`<div>${params[0].axisValue}</div>`params.forEach(item=>{if(......
  • 【C++】STL--queue、deque、priority的模拟实现和应用
    目录1、queue的介绍1.2queue的常规操作 2、queue的模拟实现 3、priority_queue(优先级队列)的介绍和实现3.1priority_queue的使用 3.2 priority_queue的应用 3.3 priority_queue的模拟实现4、deque4.1deque的原理介绍4.2deque的缺陷4.3 为什么选择deque作......
  • 解决table内容超常溢出时tooltip位置偏移的问题
      解决思路:<divstyle="width:100px;"data-toggle="tooltip"data-placement="top"title="${displayValue}">${displayValue.substring(0,5)+"..."}</div>这部分截取部分数据,超出...{field:&quo......
  • PH热榜 | 2024-11-14
    DevNow是一个精简的开源技术博客项目模版,支持Vercel一键部署,支持评论、搜索等功能,欢迎大家体验。[在线预览](https://www.laughingzhu.c1.Vocera标语:利用模拟和监控加速语音代理上线这句话的意思是:通过使用模拟和监控工具,可以更快地开发并上线语音代理。解释:语......
  • 基于微信小程序的医院挂号预约系统设计与实现(源码+论文+部署讲解等)
    博主介绍:✌全网粉丝60W+,csdn特邀作者、Java领域优质创作者、csdn/掘金/哔哩哔哩/知乎/道客/小红书等平台优质作者,计算机毕设实战导师,目前专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌技术栈范围:SpringBoot、Vue、SSM、Jsp、HLMT、Nodejs......
  • 23.Python基础篇-模块和包
    模块(Module)模块的定义:模块是包含Python代码的.py文件,可包含变量、函数、类等代码单元。每个Python文件本质上就是一个模块。两种使用方式import与from...import...importmath#导入整个模块frommathimportpi,sqrt#导入模块中的特......