python中_init_.py的作用

 更新时间:2025年01月03日 11:49:51   作者:Python之栈  
__init__.py的作用是告诉Python这是一个包,并且可以包含初始化操作、控制子模块导入、设置包级别变量和函数等,本文就来详细的介绍一下_init_.py的作用,感兴趣的可以了解一下

最近有几个小伙伴问了我一个经典问题:“__init__.py 到底有啥用?”

其实这个问题挺常见的,尤其是对Python新手来说简直就是一团迷雾。今天就站在一位老程序员的角度来给大家唠一唠__init__.py的用途和奥秘,顺便帮大家“踩踩坑”,看看有哪些用法需要注意。

1. __init__.py 是个啥?

__init__.py,顾名思义,这个文件名就透露出它是用来“初始化”的。在Python里,它主要用于标识一个目录是一个“包(Package)”。

你在项目里新建了一个文件夹,要让它成为一个可供导入的模块包,最简单的办法就是在里面加一个__init__.py。

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

当我们想要在外部使用my_project这个包时,就可以这样导入:

有了__init__.py的存在,Python才知道my_project是一个包,而不是一个普通的文件夹。

所以这个文件的基本作用就是:告诉Python,“这里是个包,你可以在其他地方导入我!”

2. __init__.py 还能做些啥?

很多初学者以为这个文件只能“声明”包,实际上它的用法比你想象的要丰富得多。在__init__.py里你可以编写代码,它会在包被导入时自动执行。这有什么用呢?我给大家举几个常见的例子:

  • 模块初始化操作

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

这样,当你一导入my_project时,config.yaml就被自动加载了,是不是很方便?你再也不用在每个子模块里重复配置路径啦!

  • 控制子模块导入

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

你看,这种做法就好比你开了一个餐厅,顾客刚一进门就能看到招牌菜,这样体验就好了,少了很多绕路时间。

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

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

这样在任何地方,只要你导入了my_project,就能直接调用show_info()了。

3. __init__.py 的一些“坑”

俗话说得好,“有光的地方就有阴影”。别看__init__.py这么实用,里面也有不少坑,尤其是**循环导入(Circular Import)**的问题,这个坑可是踩一次怀疑人生那种级别的。

什么是循环导入?

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

然后你又在module2.py里这样写:

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

如何解决?

一般来说,解决方案有两种:

延迟导入:将导入语句放在函数内部,而不是放在文件头部。

重构代码结构:把相互依赖的部分提取出来,放到一个公共模块里,这样两个模块就不会直接互相依赖了。

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

另外,再讲一个可能让人头疼的点——相对导入和绝对导入。很多小伙伴可能会在__init__.py里用相对导入的语法,比如:

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

解决方案呢?我建议——尽量使用绝对导入,比如这样:

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

5. 还有哪些小技巧?

说了这么多,最后再给大家提几个小技巧,帮你在使用__init__.py时少走弯路:

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

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

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

合并子模块:你可以在__init__.py中把子模块的功能合并到一个命名空间中,让用户使用起来更方便。

记录导入顺序:如果你的包里有很多子模块,建议记录导入顺序,避免因为导入顺序导致一些诡异的Bug。

总体来说,__init__.py用得好,它能让整个包管理得井井有条,用得不好,它就会变成你代码里的“绊脚石”。

到此这篇关于python中_init_.py的作用的文章就介绍到这了,更多相关python _init_.py内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python中的异常处理try/except/finally/raise用法分析

    Python中的异常处理try/except/finally/raise用法分析

    这篇文章主要介绍了Python中的异常处理try/except/finally/raise用法,结合实例形式分析了Python异常处理try/except/finally/raise相关功能与使用操作技巧,并附带了Python常见异常的表格说明,需要的朋友可以参考下
    2019-02-02
  • Python自动化之批量处理工作簿和工作表

    Python自动化之批量处理工作簿和工作表

    今天给大家整理了如何使用Python实现批量处理工作簿和工作表,文中有非常详细的介绍及代码示例,对小伙伴们很有帮助,需要的朋友可以参考下
    2021-06-06
  • 解决每次打开pycharm直接进入项目的问题

    解决每次打开pycharm直接进入项目的问题

    今天小编就为大家分享一篇解决每次打开pycharm直接进入项目的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • numpy创建单位矩阵和对角矩阵的实例

    numpy创建单位矩阵和对角矩阵的实例

    今天小编就为大家分享一篇numpy创建单位矩阵和对角矩阵的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • 使用Python爬了4400条淘宝商品数据,竟发现了这些“潜规则”

    使用Python爬了4400条淘宝商品数据,竟发现了这些“潜规则”

    这篇文章主要介绍了使用Python爬了4400条淘宝商品数据,竟发现了这些“潜规则”,笔者用 Python 爬取淘宝某商品的全过程,并对商品数据进行了挖掘与分析,最终得出结论。需要的朋友可以参考下
    2018-03-03
  • python使用Tkinter显示网络图片的方法

    python使用Tkinter显示网络图片的方法

    这篇文章主要介绍了python使用Tkinter显示网络图片的方法,涉及Python操作图片的相关技巧,需要的朋友可以参考下
    2015-04-04
  • 四种Python机器学习超参数搜索方法总结

    四种Python机器学习超参数搜索方法总结

    在建模时模型的超参数对精度有一定的影响,而设置和调整超参数的取值,往往称为调参。本文将演示在sklearn中支持的四种基础超参数搜索方法,需要的可以参考一下
    2022-11-11
  • Python面向对象封装案例基础教程

    Python面向对象封装案例基础教程

    这篇文章主要为大家介绍了Python面向对象封装案例基础教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • MAC中PyCharm设置python3解释器

    MAC中PyCharm设置python3解释器

    本文给大家分享的是修改MACA中pycharm的默认的Python解释器,由于默认解释器是Python2,使用起来各种不便,下面给大家讲解下如何修改
    2017-12-12
  • Python中星号的五种用法小结

    Python中星号的五种用法小结

    本文主要介绍了Python中星号的五种用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02

最新评论