全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Python模块的__name__属性如何由导入方式决定?

python中模块的`__name__`值由其在`sys.path`中的**解析路径**和**包层级结构**共同决定,而非源文件物理位置;不同导入方式(绝对/相对、路径修改前后)会导致同一.py文件被加载为多个独立模块,拥有不同的`__name__`。

在Python中,__name__不是静态绑定到源文件的“身份证”,而是模块对象在sys.modules字典中的键名——这个键名由Python导入系统根据当前sys.path、执行上下文(如是否作为包成员被导入)以及导入语句的语法共同推导得出。

核心规则:__name__ = 导入路径的完全限定名(Fully Qualified Name)

  • 当模块以 from test.a import base 方式导入时,Python将其注册为 sys.modules['test.a.base'],因此 base.__name__ == 'test.a.base';
  • 当通过修改sys.path使test/a/目录被当作顶层包(即与test/同级)并执行 from a import base 时,它被注册为 sys.modules['a.base'],故 base.__name__ == 'a.base';
  • 关键点:即使a/base.py是同一物理文件,只要导入路径不同,Python就视为两个独立模块,并分别创建两个module对象,各自拥有不同的__name__、全局命名空间和状态(如模块级变量、已执行的print等)。

实例验证(基于你的目录结构)

假设运行 python main.py(main.py位于test同级),默认sys.path[0]为main.py所在目录,其中仅test/可被识别为包:

# main.py
import test  # 触发 method1 行为

此时:

  • from .a import * → 解析为 test.a → base.py 的 __name__ 是 'test.a.base'
  • from test.b.b1 import * → 同样走 test 包路径 → base.py 仍为 'test.a.base'

而当你在 test/__init__.py 中执行:

import sys
import os
sys.path.append(os.path.dirname(__file__) + "/./")  # 等价于添加当前目录(即 test/ 父目录)

你实际上将 test 的父目录加入了sys.path,使得原test/a/目录现在可被直接识别为顶层包a/(因该目录含__init__.py)。此时:

  • from a import * → Python找到/a/__init__.py → base.py 被加载为 'a.base'
  • 但 from test.a import base 仍存在且优先命中已缓存的 'test.a.base'(因test仍在sys.path中且更早)

⚠️ 注意:这会导致同一.py文件被加载两次——一次为'a.base',一次为'test.a.base',二者互不影响。例如对base.py中某个全局变量的修改,不会反映在另一个模块实例中。

✅ 正确实践建议

  1. 避免随意修改sys.path:它破坏模块唯一性,引发难以调试的状态不一致问题;
  2. 统一使用绝对导入:明确指定完整包路径(如from test.a.base import xxx),提升可读性与可维护性;
  3. 理解__name__的动态本质:它反映的是“如何被导入”,而非“文件在哪里”。可通过以下代码实时观察:
# 在 base.py 中添加
import sys
print(f"Base.py loaded as {__name__}")
print(f"Available in sys.modules: {list(k for k in sys.modules.keys() if 'base' in k)}")
  1. 启动脚本应置于包外:main.py 不应位于test/内,避免触发__main__与包内模块名冲突(如__name__ == '__main__' vs 'test.main')。

总之,__name__是Python导入机制的产物,其值严格取决于模块被发现和加载的路径上下文。掌握这一原理,是写出健壮、可预测的Python包结构的关键基础。


# python  # app  # ai  # python包 


相关文章: 建站之星导航如何优化提升用户体验?  建站之家VIP精选网站模板与SEO优化教程整合指南  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  内网网站制作软件,内网的网站如何发布到外网?  如何快速查询网址的建站时间与历史轨迹?  如何快速打造个性化非模板自助建站?  黑客如何通过漏洞一步步攻陷网站服务器?  外贸公司网站制作,外贸网站建设一般有哪些步骤?  如何用AWS免费套餐快速搭建高效网站?  网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?  如何选择CMS系统实现快速建站与SEO优化?  linux top下的 minerd 木马清除方法  c# F# 的 MailboxProcessor 和 C# 的 Actor 模型  招贴海报怎么做,什么是海报招贴?  企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  如何在IIS中配置站点IP、端口及主机头?  广州顶尖建站服务:企业官网建设与SEO优化一体化方案  如何高效利用亚马逊云主机搭建企业网站?  Java解压缩zip - 解压缩多个文件或文件夹实例  专业商城网站制作公司有哪些,pi商城官网是哪个?  ,石家庄四十八中学官网?  宝塔新建站点为何无法访问?如何排查?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  微课制作网站有哪些,微课网怎么进?  网站制作模板下载什么软件,ppt模板免费下载网站?  整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?  网站app免费制作软件,能免费看各大网站视频的手机app?  网站图片在线制作软件,怎么在图片上做链接?  如何在云虚拟主机上快速搭建个人网站?  建站之星如何实现网站加密操作?  如何高效配置IIS服务器搭建网站?  如何在宝塔面板创建新站点?  制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?  想学网站制作怎么学,建立一个网站要花费多少?  jQuery 常见小例汇总  开源网站制作软件,开源网站什么意思?  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  如何通过网站建站时间优化SEO与用户体验?  北京企业网站设计制作公司,北京铁路集团官方网站?  制作电商网页,电商供应链怎么做?  南宁网站建设制作定制,南宁网站建设可以定制吗?  如何获取上海专业网站定制建站电话?  定制建站方案优化指南:企业官网开发与建站费用解析  建站OpenVZ教程与优化策略:配置指南与性能提升  javascript中对象的定义、使用以及对象和原型链操作小结  如何高效完成自助建站业务培训?  建站之星代理平台如何选择最佳方案?  婚礼视频制作网站,学习*后期制作的网站有哪些?  香港服务器网站生成指南:免费资源整合与高速稳定配置方案 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。