【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 = name
        self.age = age

p = 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_id

e = 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 json

class User:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def to_dict(self):
        return self.__dict__

    @classmethod
    def 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] = value
        else:
            # 将其他属性存储在 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__ 是非常重要的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络安全形势与WAF技术分享

我一个朋友的网站,5月份时候被攻击了,然后他找我帮忙看看,我看他的网站、网上查资料,不看不知道,一看吓一跳,最近几年这网络安全形势真是不容乐观,在网上查了一下资料,1、中国信息通…

Wow Tab插件,一款能让你的Edge浏览器开挂的插件,微软官方出品

首先问你个问题,你的浏览器起始页是什么样的界面?是默认的界面还是极简的界面?又或者是既简洁又功能丰富的新型起始页呢?如果你的起始页是浏览器默认的,从来都没有更改过的话,建议你可以尝试一些第三方的起…

QT C++(QT控件 QPushButton,QRadioButton,QCheckBox)

文章目录 1. QPushButton 普通按钮2. QRadioButton 单选按钮3. QCheckBox 复选按钮 1. QPushButton 普通按钮 QPushButton中的重要属性 text:按钮中的文本icon:按钮的图标iconSize:按钮中图标的尺寸shortCut:按钮对应的快捷键&a…

vs2013 - 打包

文章目录 vs2013 - 打包概述installshield2013limitededitionMicrosoft Visual Studio 2013 Installer Projects选择哪种来打包? 笔记VS2013打包和VS2019打包的区别打包工程选择view打包工程中单击工程名称节点,就可以在属性框中看到要改的属性(e.g. 默认是x86, 要…

LabVIEW控制PLC的实现方式

LabVIEW与PLC的结合可以充分发挥两者的优点,实现更高效、灵活和可靠的自动化控制系统。本文将详细介绍LabVIEW控制PLC的实现方式,包括通信接口、数据交换、编程方法及实际应用案例,帮助用户理解并应用这一技术。 通信接口 常见通信协议 La…

【SQLAlChemy】常见的数据类型有哪些,Column可选的参数有哪些呢?

常见数据类型与Column参数 常见类型 Integer:整数类型,对应数据库的 int 类型。Float:浮点数类型,对应数据库的 float 类型。它占用 32 位空间。Double:双精度浮点数类型,对应数据库的 double 类型&#…

【GD32F303红枫派使用手册】第十一节 ADC-电源电压单通道ADC检测实验

11.1 实验内容 通过本实验主要学习以下内容: ADC的简介 GD32F303 ADC工作原理 查询方式实现ADC单通道采样 11.2 实验原理 11.2.1 ADC原理 我们知道,自然界中有非常多的模拟信号,比如上一节提到的光照强度,还有其他的例如温…

Python教程:Python操作MySQL基础使用

8、Python操作MySQL基础使用 8.1 安装pymysql pip install pymysql8.2 测试连接 测试代码 from pymysql import Connection# 获取到MySQL数据库的链接对象 conn Connection(# 主机名hostlocalhost,# 端口号,默认3306port3306,# 账户名userroot,# 密码password3535 )# 打印…

【JavaEE】Spring Boot 配置文件详解

一.配置文件的相关概念. 配置文件主要用于配置应用程序的行为和属性. Spring Boot的配置文件提供了一种灵活且强大的方式,用于管理应用程序的配置信息。很多项目或框架的配置信息也放在配置文件中: 项目的启动端口.数据库的连接信息(用户名/密码/驱动等的信息).第三…

Python 使用scrapy框架

1、安装scrapy 2、使用scrapy创建项目,在终端命令行 执行如下命令,会创建一个myproject项目 scrapy startproject myproject 3、创建完成后,目录结构如下 4、cd myproject进入项目 ,执行scrapy genspider weather ******,会在spiders下创建…

Linux驱动应用编程(四)IIC(获取BMP180温度/压力数据)

本文目录 一、基础1. 查看开发板手册,获取可用IIC总线2. 挂载从机,查看从机地址。3. 查看BMP180手册,使用命令读/写某寄存器值。4. 查看BMP180手册通信流程。 二、IIC常用API1. iic数据包/报2. ioctl函数 三、数据包如何被处理四、代码编写流…

《软件定义安全》之二:SDN/NFV环境中的安全问题

第2章 SDN/NFV环境中的安全问题 1.架构安全 SDN强调了控制平面的集中化,从架构上颠覆了原有的网络管理,所以SDN的架构安全就是首先要解决的问题。例如,SDN实现中网络控制器相关的安全问题。 1.1 SDN架构的安全综述 从网络安全的角度&…

Client does not support authentication protocol requested by server

连接mysql数据库报错 Client does not support authentication protocol requested by server; 打开命令行进入mysql mysql -uroot -p ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 123456;FLUSH PRIVILEGES;重新连接成功

P1072 [NOIP2009 提高组] Hankson 的趣味题

Hankson 的趣味题 这题要有思维&#xff01;对。数论&#xff01;最大公约数与最小公倍数。 用LaTex写公式&#xff0c;真的麻烦&#xff01;wcnmd!,,,,,,be---- 于是我用手写了&#xff1a; 大功告成&#xff01;上马&#xff01; #include<cstdio> using namespace …

Python | Leetcode Python题解之第134题加油站

题目&#xff1a; 题解&#xff1a; class Solution:def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:start, cur_res, total_res 0, 0, 0for i in range(len(gas)):cur_res gas[i] - cost[i]total_res gas[i] - cost[i]if cur_res < 0:cur_r…

MFA 轰炸:苹果用户的攻击目标

一些 Apple (苹果) 用户报告了利用密码重置功能进行的网络钓鱼攻击。 你注意到 iPhone 上的系统提示你输入密码。你点击“不允许”。然后这种情况一次又一次地发生。 在某个时候&#xff0c;你可能会感到恼火或开始恐慌&#xff0c;然后点击“允许”。 然后&#xff0c;你接…

【LeetCode:312. 戳气球+ 动态规划】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

创建google cloud storage notification 的权限问题

问题 根据google 的文档&#xff1a; https://cloud.google.com/storage/docs/reporting-changes#command-line 明确表示&#xff0c; 要创建storage notificaiton &#xff0c; 创建者(or service account) 只需要bucket 和 pubsub admin roles 但是实际上我在公司尝试为1个…

《令狐带你阅读JDK源码之简单集合ArrayList》

文章目录 Java简单集合ArrayList继承体系源码解析 总结 大家好哈&#xff0c;欢迎来到令狐小哥本期专栏&#xff0c;这期专栏主要是带着大家阅读JDK源码&#xff0c;我会分几期篇幅来介绍这个jdk源码、会进行剖析、梳理&#xff0c;欢迎大家指正阅读。后面我会配套自己的视频进…

C 语言实现Linux终端显示IP二维码

调试信息&#xff1a;开发者可以在终端生成二维码&#xff0c;包含调试信息或日志数据&#xff0c;便于移动设备扫描和查看。设备配置&#xff1a;物联网设备配置时&#xff0c;通过终端生成配置二维码&#xff0c;扫描后进行设备配置。 Ubuntu/Debian 环境安装二维码库 sudo a…