当前位置: 首页 > article >正文

Python 3.12 Special Attribute - 08 - __module__

Python 3.12 Special Attribute -__module____module__是 Python 中一个重要的内置特殊属性它存储了定义类、函数、方法的模块名称字符串。这个属性在序列化如pickle、动态导入、调试以及框架设计中扮演着关键角色。理解__module__有助于掌握 Python 对象的起源以及在跨模块环境中正确地恢复对象。本文将详细解析__module__的定义、用途、不同对象上的表现并通过多个示例演示其行为最后从 CPython 底层探讨其实现机制。1.__module__的基本概念定义__module__是一个字符串表示定义该对象的模块的完整名称如os、collections.abc。对于交互式环境中定义的对象__module__通常为__main__。适用对象类class存储类定义所在的模块名。函数function存储函数定义所在的模块名。方法method通常继承其所属类的__module__。不适用对象模块本身没有__module__属性模块的__name__是其名称。示例# module_example.pyclassMyClass:passdefmy_func():passprint(MyClass.__module__)# 输出: __main__print(my_func.__module__)# 输出: __main__print(__name__)# __main__2. 不同对象上的__module__2.1 类的__module__importosprint(os.PathLike.__module__)# 输出: osprint(list.__module__)# 输出: builtins2.2 函数的__module__deffoo():passprint(foo.__module__)# 输出: __main__如果定义在交互式环境或主模块2.3 方法的__module__方法通常与其所属类共享__module__classC:defmethod(self):passprint(C.method.__module__)# 输出: __main__2.4 动态创建的对象通过type()动态创建的类默认__module__是调用type的模块名但可以手动设置DynamicClasstype(DynamicClass,(),{})print(DynamicClass.__module__)# 输出: __main__如果在主模块中调用3. 用途与典型场景序列化与反序列化pickle模块在序列化一个类或函数时会保存其__module__和__qualname__以便在反序列化时能够正确地重新导入并恢复对象。动态导入通过__module__和__name__或__qualname__可以动态地重新获取对象用于插件系统或配置驱动。调试与日志打印对象的__module__可以帮助快速定位对象来源。框架设计ORM 框架如 SQLAlchemy利用__module__来映射数据库表与模型类并支持跨模块的模型继承。自动文档生成Sphinx 等工具使用__module__来组织文档的模块结构。4. 示例与逐行解析示例 1查看内置类和函数的__module__importbuiltinsprint(int.__module__)# builtinsprint(str.__module__)# builtinsprint(len.__module__)# builtins逐行解析行代码解释1导入builtins只是为了展示实际上int等已经内置。3-6打印各个内置类型的__module__所有内置类型和函数都位于builtins模块中。为什么这样写展示内置对象的__module__都是builtins这有助于理解它们不属于任何用户模块。示例 2pickle对__module__的依赖importpickleclassMyClass:pass# 序列化datapickle.dumps(MyClass)# 反序列化需要在相同或可导入的模块中reconstructedpickle.loads(data)print(reconstructed.__module__)# 输出: __main__逐行解析行代码解释1导入pickle用于序列化。3-4定义MyClass位于__main__模块。7pickle.dumps(MyClass)将类对象序列化为字节流其中包含__module__和__name__。10pickle.loads(data)反序列化时pickle会使用__module__动态导入模块然后获取类。11打印__module__确认重建的类仍然来自__main__。为什么这样写演示__module__在 pickle 中的核心作用没有它反序列化无法找到类定义。示例 3通过__module__动态重新导入类importimportlibclassMyClass:passmodule_nameMyClass.__module__ class_nameMyClass.__name__# 动态导入模块并获取类moduleimportlib.import_module(module_name)clsgetattr(module,class_name)print(clsisMyClass)# True逐行解析行代码解释1导入importlib用于动态导入。3-4定义MyClass类位于当前模块。6-7获取__module__和__name__保存模块名和类名。10importlib.import_module(module_name)根据模块名导入模块对象。11getattr(module, class_name)从模块中获取类对象。13比较确认动态获取的类与原类是同一个。为什么这样写演示如何利用__module__实现对象的“热加载”或插件化。示例 4修改__module__的影响谨慎操作classOriginal:passOriginal.__module__fake.module# pickle 会使用修改后的模块名importpickle datapickle.dumps(Original)# 反序列化时会在 fake.module 中查找 Original大概率失败# _pickle.PicklingError:# Cant pickle class fake.module.Original:# import of module fake.module failed逐行解析行代码解释1-2定义类Original正常模块为__main__。4修改__module__为fake.module不推荐这样做会破坏 pickle 和其他依赖模块名的机制。7-9尝试 pickle序列化成功但反序列化时会去导入不存在的模块导致错误。为什么这样写警示不要随意修改__module__除非你完全理解其后果。5. 底层实现机制CPython在 CPython 中__module__的存储方式因对象类型而异类对象PyTypeObject类的__module__属性存储在类的字典tp_dict中键为__module__。当通过type.__new__创建类时会根据当前编译时的模块上下文自动设置该值。具体来说__module__是从创建类的栈帧中获取的__name__。函数对象PyFunctionObject函数对象有一个专门的字段func_module在 Python 3.11 中为func_module之前版本也类似用于存储定义函数的模块名称。在编译函数时编译器会记录当前模块的名称并将其赋值给函数的func_module。方法对象方法实际上是对函数的包装其__module__通常直接引用函数的__module__或者从所属类继承。创建过程当 Python 解析class语句时会创建新的类对象并设置其__module__为当前运行模块的__name__。对于函数同样在编译时设置__module__。动态创建的对象如通过type()或FunctionType如果没有显式提供__module__则默认使用调用者的模块名通常是__main__。只读性__module__在 Python 层面是可写的因为它只是字典中的一个键或普通属性但修改它可能导致 pickle 无法正确恢复对象因此应视为只读。6. 注意事项与陷阱不要随意修改__module__修改后会影响 pickle、importlib等依赖模块名的功能可能导致难以调试的错误。动态创建的类使用type(name, bases, dict)创建类时默认__module__是调用type的模块名。如果需要在其他模块中使用应显式设置dict[__module__] your.module。嵌套类嵌套类的__module__是其外部类所在的模块名而不是外部类的限定名。与__qualname__的关系__module____qualname__可以唯一标识一个嵌套类或函数。在装饰器中装饰器可能会包装函数导致__module__指向装饰器定义的模块。使用functools.wraps可以复制原函数的__module__。7. 与其他特殊属性的关系属性关系__name__对象的直接名称配合__module__可唯一标识顶级对象。__qualname__对象的限定名称与__module__组合可唯一标识嵌套对象。__dict__类的__module__通常存储在__dict__中。__class__实例的__class__指向类而类的__module__指示类定义的位置。8. 总结特性说明角色存储定义类、函数、方法的模块名称类型str适用对象类、函数、方法模块无此属性访问方式obj.__module__可写性可写但不推荐底层类tp_dict中的键函数func_module字段典型用途pickle 序列化、动态导入、调试、框架注册最佳实践视为只读动态创建类时显式设置不要随意修改掌握__module__是深入理解 Python 对象来源和跨模块交互的基础。无论是编写可序列化的类还是构建动态插件系统__module__都是不可或缺的元数据。希望本文能帮助你全面掌握这一特殊属性。如果在学习过程中遇到问题欢迎在评论区留言讨论!

相关文章:

Python 3.12 Special Attribute - 08 - __module__

Python 3.12 Special Attribute - __module____module__ 是 Python 中一个重要的内置特殊属性,它存储了定义 类、函数、方法 的模块名称(字符串)。这个属性在序列化(如 pickle)、动态导入、调试以及框架设计中扮演着…...

Geo-SAM:地理空间AI图像分割的技术实现与应用实践

Geo-SAM:地理空间AI图像分割的技术实现与应用实践 【免费下载链接】Geo-SAM A QGIS plugin tool using Segment Anything Model (SAM) to accelerate segmenting or delineating landforms in geospatial raster images. 项目地址: https://gitcode.com/gh_mirror…...

告别卡顿!在Vue项目中优化HLS/FLV播放的5个实战技巧与避坑指南

告别卡顿!在Vue项目中优化HLS/FLV播放的5个实战技巧与避坑指南 视频播放卡顿、首屏加载缓慢、内存泄漏——这些看似小问题,却能让用户体验断崖式下跌。当你的Vue项目从demo走向生产环境,面对高并发访问和复杂网络环境时,基础播放功…...

VMware Workstation Pro 25H2u1 Unlocker OEM BIOS 2.7 for Windows Linux

VMware Workstation Pro 25H2u1 Unlocker & OEM BIOS 2.7 for Windows & Linux 在 Windows 和 Linux 上运行 macOS Tahoe 请访问原文链接:https://sysin.org/blog/vmware-workstation-unlocker/ 查看最新版。原创作品,转载请保留出处。 作者主…...

PyCharm新项目避坑指南:如何为你的机器学习项目指定正确的Python3.10+CUDA12.1解释器

PyCharm新项目避坑指南:如何为你的机器学习项目指定正确的Python3.10CUDA12.1解释器 当你准备在PyCharm中启动一个新的机器学习项目时,最关键的步骤之一就是正确配置Python解释器。这不仅关系到代码能否正常运行,更直接影响GPU加速是否可用。…...

VMware Workstation Pro 25H2u1 发布 - 领先的免费桌面虚拟化软件

VMware Workstation Pro 25H2u1 for Windows & Linux - 领先的免费桌面虚拟化软件 基于 x86 的 Windows、Linux 桌面虚拟化软件 请访问原文链接:https://sysin.org/blog/vmware-workstation/ 查看最新版。原创作品,转载请保留出处。 作者主页&…...

ROS 2传感器数据融合入门:手把手教你用Python同步处理摄像头图像和激光雷达点云

ROS 2多传感器数据融合实战:基于Python的视觉-激光时空同步技术 在移动机器人感知系统开发中,摄像头和激光雷达的组合堪称经典配置——前者提供丰富的纹理和颜色信息,后者则能精确测量物体距离。但当你尝试同时使用这两种传感器时&#xff0c…...

MySQL优化全攻略:索引、SQL与分库分表的最佳实践鸵

一、各自优势和对比 这是检索出来的数据,据说是根据第三方评测与企业数据,三款产品在代码生成质量上各有侧重: 产品 语言优势 场景亮点 核心差异 百度 Comate C核心代码质量第一;Python首生成率达92.3% SQL生成准确率提升35%&…...

EMQX 在 K8s 环境部署 + 数据持久化 完整实操笔记

一、核心目标 在 K8s 集群中部署 EMQX 5.0.23,实现: Dashboard 管理员密码持久化(重启 Pod 不恢复默认); MQTT 消息持久化(保留消息重启后可读取); 生产级架构:Headless 服务(内部通信)+ NodePort 服务(外部访问)。 二、整体流程 & 问题解决(从 0 到生产) …...

开源可部署StructBERT模型:低成本GPU方案实现企业级语义匹配能力(<2GB显存)

开源可部署StructBERT模型&#xff1a;低成本GPU方案实现企业级语义匹配能力&#xff08;<2GB显存&#xff09; 1. 项目简介与核心价值 StructBERT中文句子相似度分析工具是一个基于阿里达摩院开源StructBERT大规模预训练模型开发的本地化语义匹配解决方案。这个工具专门针…...

Phi-4-mini-reasoning实操手册:WebShell日志分析技巧与常见报错解决方案

Phi-4-mini-reasoning实操手册&#xff1a;WebShell日志分析技巧与常见报错解决方案 1. 模型简介与部署验证 Phi-4-mini-reasoning是一个基于合成数据构建的轻量级开源模型&#xff0c;专注于高质量、密集推理的数据处理能力。作为Phi-4模型家族的一员&#xff0c;它特别强化…...

MusePublic Art Studio实战案例:品牌视觉升级项目中AI辅助设计流程

MusePublic Art Studio实战案例&#xff1a;品牌视觉升级项目中AI辅助设计流程 1. 项目背景与挑战 最近我们接手了一个品牌视觉升级项目&#xff0c;客户是一家新兴的咖啡连锁品牌&#xff0c;需要全面更新品牌视觉系统。传统设计流程中&#xff0c;从概念构思到最终定稿往往…...

K8s入门到实战

一&#xff0c;简介 1&#xff0c;k8s概述 容器管理适用于集群部署&#xff0c;自动化部署 k8s利于应用扩展 k8s目标实施让容器化应用更加简洁和高效 2&#xff0c;k8s特性 自动装箱&#xff1a;基于容器对应用运行环境的资源配值要求自动部署应用 自我修复&#xff1a;当…...

某型高速可回收模块化靶标无人机总体设计方案

1. 总体设计1.1 项目概述与设计目标本方案面向新一代防空武器系统测试、训练需求的高性能靶标无人机。其核心任务是逼真模拟典型高速突防空中威胁&#xff08;如巡航导弹、战斗轰炸机等&#xff09;的飞行特性、电磁特征与机动模式&#xff0c;为防空部队提供高价值、高强度、低…...

PlugY 无限仓库:突破暗黑2单机局限的全方位增强完全指南

PlugY 无限仓库&#xff1a;突破暗黑2单机局限的全方位增强完全指南 问题导入&#xff1a;暗黑2单机玩家的三大核心痛点 暗黑破坏神2作为ARPG游戏的里程碑之作&#xff0c;其单机模式长期存在着三个难以逾越的障碍。首先是储物空间危机——原版3x10格的箱子容量在面对海量装备时…...

PlugY:暗黑破坏神2单机体验增强的技术解决方案

PlugY&#xff1a;暗黑破坏神2单机体验增强的技术解决方案 一、价值定位&#xff1a;PlugY的技术革新与核心优势 跨角色资源池的实现机制 PlugY通过创新的共享存储架构&#xff0c;突破了原版游戏角色间的资源壁垒。该系统采用分布式存储模型&#xff0c;将物品数据与角色数据分…...

Apache APISIX CORS 插件来处理跨域问题 |allow_credential: true配置约束

文章目录 Apache APISIX CORS 插件深度排障:`allow_origins_by_regex` + `allow_credential` 的隐蔽陷阱 一、背景 二、问题复现 配置 测试 预期结果 实际结果 三、深入理解 `allow_credential` 参数 3.1 一句话定义 3.2 它不控制什么 3.3 工作机制:前后端的"双向握手&q…...

从Flannel迁移到Calico:Kubernetes网络插件实战切换指南

1. 为什么需要从Flannel迁移到Calico&#xff1f; 很多刚开始接触Kubernetes的朋友都会选择Flannel作为默认网络插件&#xff0c;毕竟它简单易用&#xff0c;开箱即配。但当你需要更精细的网络控制时&#xff0c;Flannel就显得力不从心了。我去年负责的一个电商项目就遇到了这个…...

别再只写ChatGPT提示词了!用LangChain和AutoGen给AI装上‘手和脚’的保姆级教程

从提示词到智能体&#xff1a;用LangChain和AutoGen构建能动手的AI助手 想象一下&#xff0c;你正在开发一个电商客服系统。传统的AI客服只能回答"退货政策是什么&#xff1f;"这样的问题&#xff0c;而真正的业务需求是&#xff1a;"帮我处理订单12345的退货&a…...

1 2.1 使用“记事本”编辑文本文档

&#x1f525;个人主页&#xff1a;杨利杰YJlio❄️个人专栏&#xff1a;《Sysinternals实战教程》《Windows PowerShell 实战》《WINDOWS教程》《IOS教程》《微信助手》《锤子助手》 《Python》 《Kali Linux》 《那些年未解决的Windows疑难杂症》&#x1f31f; 让复杂的事情更…...

⾃动化测试常⽤函数(下)

等待通常代码执⾏的速度⽐⻚⾯渲染的速度要快&#xff0c;如果避免因为渲染过慢出现的⾃动化误报的问题呢&#xff1f;可 以使⽤selenium中提供的三种等待⽅法&#xff1a;强制等待Thread.sleep&#xff08;&#xff09;优点&#xff1a;使⽤简单&#xff0c;调试的时候⽐较有效…...

Phi-4-reasoning-vision-15B效果展示:手机短信截图→关键信息(时间/金额/对象)精准抽取

Phi-4-reasoning-vision-15B效果展示&#xff1a;手机短信截图→关键信息&#xff08;时间/金额/对象&#xff09;精准抽取 1. 模型能力概览 Phi-4-reasoning-vision-15B是微软推出的视觉多模态推理模型&#xff0c;专门针对图像理解和信息提取任务进行了优化。这个模型最令人…...

LVGL实战解析:Display、Screen与Layer的协同与层级管理

1. Display&#xff1a;物理显示接口的实战理解 第一次接触LVGL的Display概念时&#xff0c;我误以为它和电脑显示器是同一个东西。实际在嵌入式开发中&#xff0c;Display更像是一个抽象的数据通道——它连接着LVGL的图形系统和物理显示设备。举个例子&#xff0c;我在STM32F7…...

Android16进阶之SoundPool.setVolume调用流程与实战(二百七十九)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》作者 博主新书推荐&#xff1a;《Android系统多媒体进阶实战》&#x1f680; Android Audio工程师专栏地址&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; Android多媒体专栏地址&a…...

Polycide vs. Salicide vs. Silicide: 工艺选择与电阻优化的深度解析

1. 半导体工艺中的硅化物技术&#xff1a;从基础到实战 在芯片制造过程中&#xff0c;金属硅化物技术就像电路中的"高速公路收费站"&#xff0c;直接影响着电流的通行效率。想象一下&#xff0c;当你开车经过收费站时&#xff0c;如果收费窗口太少或者收费员动作太慢…...

Android16进阶之SoundPool.play调用流程与实战(二百七十八)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》作者 博主新书推荐&#xff1a;《Android系统多媒体进阶实战》&#x1f680; Android Audio工程师专栏地址&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; Android多媒体专栏地址&a…...

RevokeMsgPatcher终极指南:Windows平台消息防撤回与多开完整解决方案

RevokeMsgPatcher终极指南&#xff1a;Windows平台消息防撤回与多开完整解决方案 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁&#xff08;我已经看到了&#xff0c;撤回也没用了&#xff09; 项目地址: http…...

倚天剑术40--内置OFD播放器

随着信创化的推进OFD格式逐步走入了大家的视线&#xff0c;比如说发票下载的时候&#xff0c;总会有个OFD的选项&#xff0c;而且有的时候政府的公文也会用这种格式发放。在Windws平台下&#xff0c;WPS直接就能打开OFD格式文件&#xff0c;用起来还是比较方便的&#xff0c;但…...

【PCIe 验证每日学习・Day29】PCIe 链路训练与 LTSSM 状态机全解析

大家好&#xff0c;今天我们进入 PCIe 最核心、最基础&#xff0c;同时也是所有链路问题根源的模块&#xff1a;LTSSM 链路训练状态机。内容承接此前电源管理、虚拟化、中断等知识&#xff0c;从 “上电链路建立” 到 “异常恢复” 完整拆解&#xff0c;所有描述严格遵循 PCIe …...

2000-2025年 地级市-创新型产业集群试点(xlsx)

01、数据概览 本数据集详细记录了中国各地级市创新型产业集群试点的设立状况。该试点项目经科技部正式批准&#xff0c;旨在通过资源整合与政策扶持&#xff0c;促进创新驱动发展&#xff0c;助力经济迈向高质量增长阶段。其实施方式可视为一种准自然实验&#xff0c;通过局部…...