Python 高级编程 021__dict__与dir的深度解析Bilibili 同步视频一、先搭舞台一个简单的继承示例二、__dict__对象属性的 “存储字典”1. 底层核心高性能的内置数据结构2. 实例的 __dict__只存自身实例属性3. 类的 __dict__包含完整类信息4. 动态操控直接修改 __dict__ 增删属性三、dir()对象全貌的 “属性清单”1. 核心用法一键获取全量属性2. dir() 与 __dict__ 的关键区别3. 兼容无 __dict__ 的内置对象四、总结用好自省吃透 Python 对象在 Python 面向对象的世界里自省Introspection是一项极具魅力的核心能力 —— 它让我们能在程序运行时主动探查对象的类型、属性、方法与内部结构就像拥有一双 “透视眼”穿透封装看清对象的本质。今天我们就聚焦 Python 自省最常用的两大神兵__dict__**** 属性与dir()** 内置函数**从继承案例入手彻底搞懂它们的用法、区别与底层逻辑✨。Bilibili 同步视频Python 高级编程 021__dict__与dir()的深度解析一、先搭舞台一个简单的继承示例为了清晰演示自省机制我们先定义一组具有继承关系的类这是后续所有操作的基础# 定义父类 PersonclassPerson:人基础父类nameuser# 类属性# 定义子类 Student继承自 PersonclassStudent(Person):学生继承 Person扩展自有属性def__init__(self):self.school_name慕课网# 实例属性# 实例化 Student 对象userStudent()这里的层级关系很清晰Student→ 继承Person→ 实例化为userPerson的类属性name与Student的实例属性school_name共同构成了对象的属性体系。二、__dict__对象属性的 “存储字典”1. 底层核心高性能的内置数据结构在CPython 编译器中__dict__是纯 C 语言实现的字典经过了极致优化是 Python 性能最高的数据结构之一。Python 类与实例的所有属性本质上都通过__dict__来存储和管理 —— 它就是对象属性的 “专属账本”。2. 实例的__dict__只存自身实例属性直接打印实例user的__dict__我们会发现print(user.__dict__)# 输出{school_name: 慕课网}它只包含实例自身初始化的属性并没有父类Person的name属性但神奇的是直接访问user.name依然能得到结果print(user.name)# 输出user这是 Python 的MRO方法解析顺序在起作用访问属性时Python 会沿继承链向上查找name是父类Person的类属性不属于子类实例因此不会出现在实例的__dict__中。3. 类的__dict__包含完整类信息类本身也是对象它的__dict__远比实例丰富包含模块、类名、文档、弱引用、类属性等全部信息print(Person.__dict__)输出会包含__module__所属模块、name类属性、__doc__类文档、__dict__自身引用、__weakref__弱引用等完整元信息。4. 动态操控直接修改__dict__增删属性__dict__不仅能查看还能直接读写实现对象属性的动态操控# 动态添加实例属性user.__dict__[school_addr]北京市# 直接访问新属性print(user.school_addr)# 输出北京市这就是__dict__的强大之处 —— 直接操作对象的属性存储字典灵活掌控对象状态。三、dir()对象全貌的 “属性清单”如果说__dict__是属性账本那dir()就是全量目录。dir()是 Python 内置的自省函数功能比__dict__更强大能列出对象所有可用属性与方法含继承的、内置的魔法方法。1. 核心用法一键获取全量属性# 查看 Student 实例的所有属性print(dir(user))执行后会输出一长串列表不仅有school_name、name还有 Python 内置的__init__、__str__、__class__等魔法方法覆盖对象的全部可用成员。2.dir()与__dict__的关键区别特性__dict__dir()内容仅对象自身存储的属性 对应值对象所有可用属性 / 方法名含继承、内置格式字典键值对列表仅名称适用场景查看 / 修改自有属性、动态操控快速探查对象全貌、确认支持的方法3. 兼容无__dict__的内置对象很多 Python 内置类型如list、str没有 ****__dict__直接访问会抛异常但dir()依然能完美工作a[1,2,3]# print(a.__dict__) # 报错AttributeErrorprint(dir(a))# 正常输出 list 的所有方法与属性这让dir()成为探查所有 Python 对象的通用工具尤其适合查看内置类型实现的魔法函数。四、总结用好自省吃透 Python 对象自省是什么运行时探查对象内部结构的能力是 Python 动态语言的核心特性__dict__C 语言实现的高性能属性字典存自身属性 值支持动态操控类与实例都有dir()全量属性清单列所有可用成员无值、兼容所有对象适合快速探查属性查找实例无属性时Python 会通过 MRO 沿继承链向上查找父类属性不属于实例本身。掌握__dict__与dir()就等于掌握了 Python 对象的透视密码无论是调试、源码阅读还是动态编程都能事半功倍。下一节我们将继续探索 Python 面向对象的另一核心super()**** 函数彻底理清继承中的方法调用逻辑