【Python】一文向您详细介绍 `__dict__` 的作用和用法

【Python】一文向您详细介绍 __dict__ 的作用和用法
 
下滑即可查看博客内容
在这里插入图片描述

🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇

🎓 博主简介985高校的普通本硕,曾有幸发表过人工智能领域的 中科院顶刊一作论文,熟练掌握PyTorch框架

🔧 技术专长: 在CVNLP多模态等领域有丰富的项目实战经验。已累计提供近千次定制化产品服务,助力用户少走弯路、提高效率,近一年好评率100%

📝 博客风采: 积极分享关于深度学习、PyTorch、Python相关的实用内容。已发表原创文章600余篇,代码分享次数逾七万次

💡 服务项目:包括但不限于科研辅导知识付费咨询以及为用户需求提供定制化解决方案

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

🌵文章目录🌵

  • 🔍 一、初探 `__dict__`
  • 🔍 二、深入 `__dict__`
  • 🚀 三、`__dict__` 的高级用法
  • 🔗 四、举一反三:类属性与实例属性
  • 🎯 五、__dict__ 在实际应用中的案例
      • 1. 序列化与反序列化
      • 2. 对象克隆
      • 3. 调试与日志记录
      • 4. 动态属性访问
  • 📚 六、总结与展望

下滑即可查看博客内容

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

  

🔍 一、初探 __dict__

  在Python中,__dict__ 是一个内置属性,它用于存储对象的实例属性。当你创建一个类并实例化一个对象时,该对象就拥有了一个 __dict__ 属性,用于存储该对象的所有属性及其对应的值

class Person:def __init__(self, name, age):self.name = nameself.age = agep = Person("Alice", 30)
print(p.__dict__)  # 输出: {'name': 'Alice', 'age': 30}

从上面的例子中,我们可以看到 p 这个 Person 类的实例对象的 __dict__ 属性包含了 nameage 两个属性及其对应的值。

🔍 二、深入 __dict__

  除了存储实例属性,__dict__ 还有一些其他的用途。比如,你可以直接通过修改 __dict__ 来改变对象的属性。

p.__dict__['name'] = 'Bob'
print(p.name)  # 输出: Bob

此外,__dict__ 还允许我们查看或修改继承而来的属性。

class Employee(Person):def __init__(self, name, age, employee_id):super().__init__(name, age)self.employee_id = employee_ide = Employee("Charlie", 35, 12345)
print(e.__dict__)  # 输出: {'name': 'Charlie', 'age': 35, 'employee_id': 12345}

🚀 三、__dict__ 的高级用法

  1. 动态添加属性:你可以通过 __dict__ 在运行时动态地给对象添加属性。

    p.__dict__['address'] = 'GuangZhou'
    print(p.address)  # 输出: GuangZhou
    
  2. 检查属性是否存在:使用 __dict__ 可以很方便地检查一个对象是否包含某个属性。

    if 'name' in p.__dict__:print("Name attribute exists.")
    
  3. 复制对象属性:你可以使用 __dict__ 来复制一个对象的所有属性到另一个对象。

    p2 = Person("", 0)
    p2.__dict__.update(p.__dict__)
    print(p2.name)  # 输出: Bob
    

注意:这里我们使用了 update 方法来合并两个字典,但请注意,这只会复制实例属性,不会复制类属性或方法。

🔗 四、举一反三:类属性与实例属性

类属性存储在类的 __dict__ 中,而实例属性存储在实例的 __dict__ 中。

class MyClass:class_var = "class variable"obj = MyClass()
obj.instance_var = "instance variable"
print(MyClass.__dict__['class_var'])  # 访问类属性
print(obj.__dict__['instance_var'])   # 访问实例属性
# class variable
# instance variable

🎯 五、dict 在实际应用中的案例

了解 __dict__ 的基本概念和用法之后,我们可以看看它在一些实际应用场景中的用途。

1. 序列化与反序列化

在Python中,我们经常需要将对象转换为可以存储或传输的格式(如JSON),这通常被称为序列化。同样地,将序列化后的数据转回为对象则被称为反序列化。由于 __dict__ 可以提供对象的所有属性及其值,因此它经常用于简单的序列化和反序列化过程。

import jsonclass User:def __init__(self, name, age):self.name = nameself.age = agedef to_dict(self):return self.__dict__@classmethoddef from_dict(cls, data):return cls(**data)# 序列化
user = User("Alice", 30)
user_dict = user.to_dict()
user_json = json.dumps(user_dict)# 反序列化
user_data = json.loads(user_json)
new_user = User.from_dict(user_data)
print(new_user.name, new_user.age)  # 输出: Alice 30

2. 对象克隆

当我们需要创建一个与现有对象具有相同属性和值的新对象时,可以使用 __dict__ 来实现。这在某些情况下(如深拷贝对象的替代方案)可能很有用。

class DeepCopyExample:def __init__(self, value):self.value = value# 使用 __dict__ 实现对象克隆
original = DeepCopyExample(42)
clone = DeepCopyExample(None)
clone.__dict__ = original.__dict__.copy()
print(clone.value)  # 输出: 42

3. 调试与日志记录

在调试或记录对象状态时,__dict__ 可以提供有关对象当前状态的快速概览。这对于理解对象的行为或跟踪问题可能非常有用。

class Loggable:def log_state(self):print(f"State of object: {self.__dict__}")# 使用示例
obj = Loggable()
obj.some_value = "example"
obj.log_state()  # 输出: State of object: {'some_value': 'example'}

4. 动态属性访问

在某些情况下,我们可能需要根据某些条件动态地访问或修改对象的属性。使用 __dict__ 可以实现这种灵活性。

class DynamicAccess:def __init__(self):self.attributes = {'name': 'Alice', 'age': 30}def __getattr__(self, item):return self.attributes.get(item)def __setattr__(self, key, value):if key in self.__dict__:# 直接设置实例属性self.__dict__[key] = valueelse:# 将其他属性存储在 attributes 字典中self.attributes[key] = value# 使用示例
obj = DynamicAccess()
print(obj.name)  # 输出: Alice
obj.city = "New York"
print(obj.city)  # 输出: New York

📚 六、总结与展望

  __dict__ 是Python中一个强大且灵活的特性,它允许我们直接访问和修改对象的属性。通过了解 __dict__ 的基本概念和用法,我们可以更好地理解和控制Python对象的行为。然而,我们也应该意识到 __dict__ 的潜在限制和注意事项,如性能开销和隐私性问题。

  在未来,随着Python的不断发展,我们可能会看到更多与 __dict__ 相关的特性和用法。例如,Python的元编程和动态特性可能会为 __dict__ 提供更多的应用场景。因此,对于希望深入理解Python内部机制或开发动态和灵活应用的开发者来说,熟悉 __dict__ 是非常重要的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/25047.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

以sqlilabs靶场为例,讲解SQL注入攻击原理【42-53关】

【Less-42】 使用 or 11 -- aaa 密码,登陆成功。 找到注入点:密码输入框。 解题步骤: # 获取数据库名 and updatexml(1,concat(0x7e,(select database()),0x7e),1) -- aaa# 获取数据表名 and updatexml(1,concat(0x7e,(select group_conca…

【教程】让小爱音箱Play增强版接入Mi-GPT

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 项目地址:https://github.com/idootop/mi-gpt MiIOT:小米小爱音箱Play 增强版 - 产品规格 - Xiaomi Miot Spec 实现效果图&…

数据库(27)——多表查询——自连接

语法 SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件...; 自连接可以是内连接查询也可以是外连接查询。 演示 我新增了字段friend便于演示 查询所有人的名字以及他们的friend的人的名字: select a.name,b.name from user a,user b where a.friendb.id; 其…

【数据结构】查找(顺序查找、二分查找、索引顺序查找、二叉排序树、平衡排序树、B树、B+树、哈希表)

目录 数据结构——查找何为查找1. 查找表2. 关键字3. 查找方法效果评价指标——平均查找长度ASL(Average Search Length) 静态查找表1.顺序查找2.二分查找二分查找判定树 3.静态查找表—索引顺序表的查找索引顺序查找表的算法原理: 动态查找树表1. 二叉排序树2. 二叉…

06 Linux 设备驱动模型

1、Overview Linux-2.6 引入的新的设备管理机制 - kobject 降低设备多样性带来的 Linux 驱动开发的复杂度,以及设备热拔插处理、电源管理等将硬件设备归纳、分类,然后抽象出一套标准的数据结构和接口驱动的开发,就简化为对内核所规定的数据结构的填充和实现驱动模型是 Linu…

Go微服务: 分布式之通过本地消息实现最终一致性和最大努力通知方案

通过本地消息实现最终一致性 1 )概述 我们的业务场景是可以允许我们一段时间有不一致的消息的状态的,并没有说必须特别高的这个消息的一致性比如说在TCC这个架构中,如果采用了消息的最终一致性,整体架构设计要轻松好多即便我们库…

获取东方财富网股票的实时数据股票的数据,并保存到Excel文件中

可以运行python文件获取东方财富网:【序号,代码,名称,最新价,涨跌幅,涨跌额,成交量,成交额,振幅,最高,最低,今开,昨收,量比,换手率,市盈率-动态,市净率,总市值,流通市值,涨速,5分钟涨跌,60日涨跌幅,年初至今涨跌幅,】数据,保存到Excel文件中。 import pandas as pd import re…

公司面试题总结(二)

7. 说说 JavaScript 中的数据类型?存储上的差别? • 基本类型: o Number o String o Boolean o Undefined o null o symbol • 引用类型 o Object o Array o Function • 声明变量时不同的内存地址分配: o 简单类型的…

嵌入式Linux系统编程 — 3.3 chown、fchown 和 lchown 函数更改文件属主

目录 1 文件属主 1.1 文件属主概念 1.2 如何查看文件属主 1.3 有效用户 ID 和有效组 ID 2 chown 函数 2.1 chown命令 2.2 chown函数 2.3 getuid 和 getgid函数 3 fchown函数 3.1 fchown函数简介 3.2 示例代码 4 lchown函数 1 文件属主 1.1 文件属主概念 Linux…

tkinter颜色选择器

tkinter颜色选择器 颜色选择器效果代码 颜色选择器 Tkinter 提供了一个简单易用的颜色选择器模块 colorchooser,通过调用 colorchooser.askcolor() 方法,我们可以轻松实现颜色选择功能。 效果 代码 import tkinter as tk from tkinter import colorch…

CSS函数: translate、translate3d的使用

translate()和translate3d()函数可以实现元素在指定轴的平移的功能。函数使用在CSS转换属性transform的属性值。实现转换的函数类型有: translate():2D平面实现X轴、Y轴的平移translate3d():3D空间实现位置的平移translateX():实…

LLVM Cpu0 新后端4

想好好熟悉一下llvm开发一个新后端都要干什么,于是参考了老师的系列文章: LLVM 后端实践笔记 代码在这里(还没来得及准备,先用网盘暂存一下): 链接: https://pan.baidu.com/s/1V_tZkt9uvxo5bnUufhMQ_Q?…

向量数据库是什么?

向量数据库是什么? 随着人工智能和机器学习技术的迅猛发展,向量数据库作为一种新型数据库引起了广泛关注。向量数据库专门用于存储和查询高维向量数据,是在大规模数据检索和相似性搜索领域的重要工具。 向量数据库的定义 向量数据库是一种…

为下一波创新做准备:人工智能和元宇宙

人工智能和元宇宙的发展带来了独特的可能性和挑战。随着这些技术的发展,我们进入了一个沉浸式虚拟体验和智能系统的时代,我们正站在一个历史性的时刻。为迎接下一波创新,采取必要的措施是很重要的。 我们正在见证两项变革性技术的激动人心的发…

以sqlilabs靶场为例,讲解SQL注入攻击原理【54-65关】

【Less-54】 与前面的题目不同是,这里只能提交10次,一旦提交超过十次,数据会重新刷新,所有的步骤需要重来一次。 解题步骤: 根据测试,使用的是单引号闭合。 # 判断字段的数量 ?id1 order by 3 -- aaa# …

WPF视频学习-基础知识篇

1.简介WPF: C# 一套关于windows界面应用开发框架 2.WPF和winform的差别 ,(WPF比较新) 创建新项目使用模板: WPF使用.xaml后缀,双击可查看操作界面和设置代码,其文件展开之后中有MainWindow.xaml.cs为程序交互逻辑。…

【Python】数据处理:文本文件操作

在Python中,处理文本文件是非常常见的任务。可以使用内置的open函数来打开、读取和写入文本文件。 打开文件 使用open函数打开文件。该函数有两个主要参数: open(file, moder, buffering-1, encodingNone, errorsNone, newlineNone, closefdTrue, ope…

OmniGlue: Generalizable Feature Matching with Foundation Model Guidance

【引用格式】:Jiang H, Karpur A, Cao B, et al. OmniGlue: Generalizable Feature Matching with Foundation Model Guidance[J]. arXiv preprint arXiv:2405.12979, 2024. 【网址】:https://arxiv.org/pdf/2405.12979 【开源代码】:https…

Redis中的主从复制

分布式系统中的几种Redis部署方式 为了解决一个程序只部署在一个服务器上的单点问题: 可用性问题,如果这个机器挂了,就意味着服务就中断了 一个程序只部署在一台机器上,它的性能/支持的并发量也是有限的 所以,就引…

力扣 240.搜素矩阵II

题目描述: 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1: 输入:matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9…