广告位联系
返回顶部
分享到

python中_init_.py的作用

python 来源:互联网 作者:佚名 发布时间:2025-01-04 21:57:07 人浏览
摘要

1. __init__.py 是个啥? __init__.py,顾名思义,这个文件名就透露出它是用来初始化的。在Python里,它主要用于标识一个目录是一个包(Package)。 你在项目里新建了一个文件夹,要让它成为一个可

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用得好,它能让整个包管理得井井有条,用得不好,它就会变成你代码里的“绊脚石”。


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • Python如何实现HTTP echo服务器

    Python如何实现HTTP echo服务器
    一个用来做测试的简单的 HTTP echo 服务器。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 from ht
  • python中_init_.py的作用

    python中_init_.py的作用
    1. __init__.py 是个啥? __init__.py,顾名思义,这个文件名就透露出它是用来初始化的。在Python里,它主要用于标识一个目录是一个包(Package)
  • Python调用JavaScript代码的几种方法
    1. 使用PyExecJS执行JavaScript代码 PyExecJS是一个流行的Python库,它可以用来在Python中运行JavaScript代码。通过这个库,Python代码可以调用JS函数,
  • python中json.dumps和json.dump区别
    1、json.dumps和json.dump的区别 json.dumps()是将 Python 对象序列化为 JSON 格式的字符串。如果你想将 JSON 数据写入文件,可以将json.dumps()生成的字符
  • 使用Python和LabelMe实现图片验证码的自动标注功能

    使用Python和LabelMe实现图片验证码的自动标注功能
    使用 Python 和 LabelMe 实现图片验证码的自动标注 在处理图片验证码时,手动标注是一项耗时且枯燥的工作。本文将介绍如何使用 Python 和 L
  • Python Pandas轻松实现数据清理
    在当今的数据驱动时代,数据清理是数据分析、机器学习项目中至关重要的一步。脏数据、缺失值、重复记录等问题都可能严重影响结果的
  • 基于Python搭建局域网大文件分享传输工具

    基于Python搭建局域网大文件分享传输工具
    1.简介 由于单位不让用优盘、禁止用飞秋、也不准使共享,禁用FTP,也禁止搭建网站,且目前局域网内用的IM不支持1G以上文件传输,于是在
  • Python中如何判断是否为AJAX请求
    在Web开发中,AJAX(Asynchronous JavaScript and XML)请求是一种非常常见的与服务器进行数据交互的方式。它允许在不重新加载整个页面的情况下,
  • 一文带你深入了解Python中的多进程编程
    在 Python 中,多进程编程是一种提高程序运行效率的有效手段。相比于多线程编程,多进程编程可以充分利用多核 CPU 的优势,实现真正的并
  • 基于Python实现web网页内容爬取的方法

    基于Python实现web网页内容爬取的方法
    在日常学习和工作中,我们经常会遇到需要爬取网页内容的需求,今天就如何基于Python实现web网页内容爬取进行讲解。 1. 网页分析 用Chrom
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计