python中_init_.py 到底有啥用?

news/2024/10/12 15:18:47

 

1. __init__.py 是个啥?

__init__.py,这个文件名就是用来“初始化”的。在Python里,它主要用于标识一个目录是一个“包(Package)”。在项目里新建了一个文件夹,要让它成为一个可供导入的模块包,最简单的办法就是在里面加一个__init__.py。

比如,咱们有个项目结构如下:

my_project/    
├── __init__.py    
├── module1.py    
└── module2.py

想要在外部使用 my_projec t这个包时,就可以这样导入:

import my_project

有了__init__.py的存在,Python才知道my_project是一个包,而不是一个普通的文件夹。所以这个文件的基本作用就是:告诉Python,“这里是个包,可以在其他地方导入我!”

2. __init__.py 还能做些啥?

1. 模块初始化操作

假如有一个需要初始化配置的工具包,可以在__init__.py里直接搞定这些初始化工作。

# 例子:my_project/__init__.pyimport os# 初始化配置文件路径
config_file = os.path.join(os.path.dirname(__file__), 'config.yaml')
print("正在初始化配置文件……")

当一导入my_project时,config.yaml就被自动加载了。再也不用在每个子模块里重复配置路径!

2.控制子模块导入

通过在__init__.py中导入函数,可以直接在 import package_name 的时候就将所有常用的子模块或者函数导入,这样就能从包的顶级目录直接访问子模块的内容了:

 

3.包级别变量和函数的初始化

还可以在__init__.py里设置一些全局变量,或者定义一些包级别的工具函数。

 

3. __init__.py 的一些“坑”【循环导入】

什么是循环导入?

假设有两个模块module1和module2,然后在module1.py中写了这样一段代码:

# module1.pyfrom .module2 import some_function

  

然后又在module2.py里这样写

# module2.pyfrom .module1 import another_function

这就会导致Python在导入包的时候出现死循环,结果是两边互相等待对方加载,最终就会报错或者无法正常导入。 

 

4. __init__.py 和相对导入的关系

相对导入和绝对导入

__init__.py里用相对导入的语法,比如:

from .module1 import func1

看上去没问题,但等到跑module1.py这个文件时,就会发现报错了!因为相对导入的方式要求你必须从顶层包开始导入。而你直接执行module1.py,Python根本不知道它是从哪个包里来的。

建议尽量使用绝对导入,比如这样:

from my_project.module1 import func1

这样不管是直接运行module1.py,还是导入整个my_project,都不会有问题。

 

5. 还有哪些小技巧?

避免复杂逻辑:不要在__init__.py中写太复杂的业务逻辑。应该是轻量级的初始化和导入,不然以后维护起来会非常麻烦。

模块导出控制:你可以用__all__来控制从包中导出哪些模块或变量。

这样当你用 from my_project import *时,Python只会导入__all__指定的内容

__all__ = ['module1', 'module2']

 

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

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

相关文章

白鲸开源WhaleStudio项目获得“创客北京2024”企业组优秀奖,晋级复赛!

近日,“创客北京2024”海淀区复赛名单正式公布,白鲸开源凭借其全球领先的云原生DataOps平台——WhaleStudio,荣获企业组优秀奖,并成功进入复赛名单。 此次“创客北京2024”海淀区级赛由中关村科学城管理委员会主办,北京中关村科学城科创服务有限公司与中国北京(海淀)留学…

Kimi 探索版发布,搜索量增强 10 倍;北大快手开源 Pyramid Flow Matching 丨 RTE 开发者日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…

Jenkins定时构建

目录Jenkins 定时任务构建定时语法 Jenkins 定时任务构建选择需要定时执行的任务并进入点击 配置 按钮进入配置界面点击 构建触发器 并跳转到对应的配置部分,勾选上 Build periodically 选项在出现的日程表中填写对应的定时语句,并点击 保存 即可生效定时语法定时构建语法:*…

智能排线助力快消品企业实现高效与最优排线

路线拜访是快消品行业深度分销模式中高效开发、管理和维护终端市场的重要方式。通过将门店归入固定的路线内,确保每家店都能按合理的频率去拜访,确保既不丢店、不漏店,又能在合理周期内给门店补货,达到业代工作效率最大化。 所以对于企业而言,给业务人员的拜访路线做好最优…

Some bytes have been replaced with the Unicode substitution character while loading file

需要修改一较旧的网页代码,当打开时,却出现异常提示: Some bytes have been replaced with the Unicode substitution character while loading file 【文档路径】 with Unicode(UTF-8) encoding. Saving the file will not preserve the original file contents. 点“OK”…

SaaS架构:开放平台架构设计

大家好,我是汤师爷~ 今天聊聊开放平台架构设计。 为什么需要搭建开放平台 增强产品能力 开放平台能够让三方开发者和合作伙伴开发新的应用或服务,增加原有SaaS产品能力。这样就可以满足更多用户需求,从而提高用户的满意度和黏性。 促进创新 三方开发者能够在SaaS标准产品的基…

获取路由器(光猫)管理员权限

获取路由器(光猫)管理员权限 文章参考自 https://www.cnblogs.com/784040932/p/5922735.html 我家的光猫图片1.用光猫背后的useradmin 帐号和密码登录 http://192.168.1.1/2.然后在浏览器地址栏中输入http://192.168.1.1/backupsettings.conf以下载backupsettings.conf3.用文…