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

news2024/12/23 12:19:46

【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__ 是非常重要的。

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

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

相关文章

20240606更新Toybrick的TB-RK3588开发板在Android12下的内核

20240606更新Toybrick的TB-RK3588开发板在Android12下的内核 2024/6/6 10:51 0、整体编译: 1、cat android12-rk-outside.tar.gz* | tar -xzv 2、cd android12 3、. build/envsetup.sh 4、lunch rk3588_s-userdebug 5、./build.sh -AUCKu -d rk3588-toybrick-x0-a…

【代码随想录】【算法训练营】【第32天】 [122]买卖股票的最佳时机II [376]摆动序列 [53]最大子序和

前言 思路及算法思维,指路 代码随想录。 题目来自 LeetCode。 day 32,一个不上班的周六,坚持一了一点~ 题目详情 [122] 买卖股票的最佳时机II 题目描述 122 买卖股票的最佳时机II 解题思路 前提:单链表 删除元素 思路&a…

【RAG入门教程02】Langchian的Embedding介绍与使用

Embedding介绍 词向量是 NLP 中的一种表示形式,其中词汇表中的单词或短语被映射到实数向量。它们用于捕获高维空间中单词之间的语义和句法相似性。 在词嵌入的背景下,我们可以将单词表示为高维空间中的向量,其中每个维度对应一个特定的特征…

279 基于matlab的粒子群集法对铁路电能质量控制系统的容量避行优化设计

基于matlab的粒子群集法对铁路电能质量控制系统的容量避行优化设计。计算出满足功率因素、电压不平衡度等电能指标的条件下。RPC所需要的补偿功率。求得所需最小的系统客量。该设计能快速计算出符合系统设定指标的各项最优补偿功率。并通过sumulink份真。检验设计参数的准确性。…

YOLOv10 超详细解析 | 网络结构、训练策略、论文解读

网络结构 1. Backbone 2. Head 3. 说明 网络结构按 YOLOv10m 绘制,不同 scale 的模型在结构上略有不同,而不是像 YOLOv8 一样仅调整 depth 和 width。Head 有部分后续计算与 YOLOv8 完全相同,上图省略,具体请看此文。YOLOv10 整…

文心一言 VS 讯飞星火 VS chatgpt (277)-- 算法导论20.3 4题

四、如果调用 vEB-TREE-INSERT 来插入一个已包含在 vEB 树中的元素,会出现什么情况?如果调用 vEB-TREE-DELETE 来删除一个不包含在 vEB 树中的元素,会出现什么情况?解释这些函数为什么有相应的运行状况?怎样修改 vEB 树…

【Git】详解本地仓库的创建、配置以及工作区、暂存区、版本库的认识

一、创建本地仓库 需要将本地仓库放在一个目录下,所以在创建本地仓库之前,应该先创建一个目录,再进入这个目录: 在这个目录中创建一个本地仓库: git init 创建完成后,我们就会发现当前目录下多了一个.git…

ApsaraMQ Copilot for RocketMQ:消息数据集成链路的健康管家

作者:文婷 引言 如何正确使用消息队列保证业务集成链路的稳定性,是消息队列用户首要关心的问题。ApsaraMQ Copilot for RocketMQ 从集成业务稳定性、成本、性能等方面帮助用户更高效地使用产品。 背景 消息队列产品通过异步消息的传递,来…

用Kimi开发部署上线一个完整的Web网页应用

首先问Kimi:我想写一个网页版的计算器应用,如何做项目规划? 根据kimi的回答,选择前端开发技术HTML、CSS、JavaScript,使用HTML和CSS构建基础结构和样式,使用JavaScript添加交互性,实现计算器的核…

Pytorch 实现目标检测二(Pytorch 24)

一 实例操作目标检测 下面通过一个具体的例子来说明锚框标签。我们已经为加载图像中的狗和猫定义了真实边界框,其中第一个 元素是类别(0代表狗,1代表猫),其余四个元素是左上角和右下角的(x, y)轴坐标(范围…

嵌入式仪器模块:音频综测仪和自动化测试软件

• 24 位分辨率 • 192 KHz 采样率 • 支持多种模拟/数字音频信号的输入/输出 应用场景 • 音频信号分析:幅值、频率、占空比、THD、THDN 等指标 • 模拟音频测试:耳机、麦克风、扬声器测试,串扰测试 • 数字音频测试:平板电…

C++笔试强训day42

目录 1.最大差值 2.兑换零钱 3.小红的子串 1.最大差值 链接https://www.nowcoder.com/practice/a01abbdc52ba4d5f8777fb5dae91b204?tpId182&tqId34396&rp1&ru/exam/company&qru/exam/company&sourceUrl%2Fexam%2Fcompany&difficulty2&judgeSta…

非线性模型预测控制NMPC例子

NMPC概述 非线性模型预测控制(Nonlinear Model Predictive Control, NMPC)是一种用于控制非线性系统的高级控制策略。与线性MPC不同,NMPC需要处理系统的非线性特性,这使得优化问题更加复杂。NMPC通常使用迭代优化算法来求解非线性优化问题 NMPC基本原理 NMPC的目标是最小…

Diffusers代码学习: T2I Adapter

T2I Adapter是一款轻量级适配器,用于控制文本到图像模型并为其提供更准确的结构指导。它通过学习文本到图像模型的内部知识与外部控制信号(如边缘检测或深度估计)之间的对齐来工作。 T2I Adapter的设计很简单,条件被传递到四个特征…

[Cloud Networking] Layer 2 Protocol

文章目录 1. STP / RSTP / MSTP Protocol1.1 STP的作用1.2 STP 生成树算法的三个步骤1.3 STP缺点 2. ARP Protocol3. DHCP Protocol3.1 DHCP 三种分配方式3.2 DHCP Relay (中继) 4. MACSEC 1. STP / RSTP / MSTP Protocol 1.1 STP的作用 消除二层环路:通过阻断冗余…

牛客 NC129 阶乘末尾0的数量【简单 基础数学 Java/Go/PHP/C++】

题目 题目链接: https://www.nowcoder.com/practice/aa03dff18376454c9d2e359163bf44b8 https://www.lintcode.com/problem/2 思路 Java代码 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改&#xff…

SpringBoot之Mybatis-plus实战

文章目录 MybatisPlus 介绍一、MyBatisPlus 集成步骤第一步、引入依赖第二步、定义mapper 二、注解TableNameTableldTableField 加解密实现步骤 在SpringBoot项目中使用Mybatis-plus,记录下来,方便备查。 MybatisPlus 介绍 为简化开发而生,官…

【源码】Spring Data JPA原理解析之事务注册原理

Spring Data JPA系列 1、SpringBoot集成JPA及基本使用 2、Spring Data JPA Criteria查询、部分字段查询 3、Spring Data JPA数据批量插入、批量更新真的用对了吗 4、Spring Data JPA的一对一、LazyInitializationException异常、一对多、多对多操作 5、Spring Data JPA自定…

git一次提交多个项目之windows

方案1:【快速】单个/多个项目提交到一个已有地址 步骤: 1,在git仓库,创建新的地址 2,在代码所在文件夹,编辑脚本 2.1,获得所有文件名:编写bat脚本,获得所有文件名称【非必须】; dir *.* /b/s>test.txt 获取所有文件之后,复制对应的文件名; 2.2,编写bat脚…