在Python工程中,我们经常可以看到带有“__init__.py”文件的目录,在PyCharm中,带有这个文件的目录被认为是Python的包目录,与目录的图标有不一样的显示。如下图所示, dir_example是一个空白目录,图标是个文件夹图标,而init_example下有_init__.py文件,其图标是一个包。

那么这个文件的作用是什么,我们平时如何使用呢?

一、__init__.py文件简介

二、__init__.py文件的使用案例

一、__init__.py文件简介

Python 定义了两种类型的包,常规包和命名空间包。常规包是传统的包,因为它们存在于 Python 3.2 和更早的版本中。一个常规包通常被实现为一个包含__init__.py 文件的目录。当一个常规包被导入时,这个__init__.py文件被隐式执行,它所定义的对象被绑定到包的名字空间中。

这是Python官方文档中对__init__.py文件的描述,其实它的意思很简单,就是说Python文件都是按照目录当作不同的模块来组织的,这个目录被认为是Python包目录,Python会通过搜索该目录下的文件来导入相关的模块。但是并不是所有的目录都会被搜索添加,只有当目录中包含__init__.py文件时,这个目录才会被Python当作是一个包目录,进而搜索添加里面的文件。这样做可以让编程者自己控制哪些目录可以被Python导入成包。

当某个目录中包含__init__.py文件时,Python在引入这个模块之前,会首先执行这个文件。因此,这个文件也可以被编程者用来控制定义包级别的变量。

综上所述,__init__.py文件最主要的作用是2个:

当目录下包含这个文件时,Python会将其当作成包目录,进而可以使用import xx.xx的方式导入目录下的文件或者模块。

使用__init__.py文件可以控制模块导入时的变量和内容,便于编程者的控制。

下面我们看几个例子即可。

二、__init__.py文件的使用案例

2.1、没有__init__.py文件的目录,使用import xx.xx会报错吗?

看版本,在较低的版本中(如3.2及以下),没有__init__.py文件的目录不能使用import xx.xx导入相关模块,但是后面的版本可以。

2.2、在__init__.py文件中定义变量或者逻辑将在导入时候被执行

例如,我们有如下的目录结构:

init_example/ a_pkg/

__init__.py

a.py

init_test.py

即init_example工程下有个init_test.py文件和a_pkg目录,a_pkg目录下有__init__.py文件和一个a.py文件。

我们在a_pkg目录下的__init__.py文件定义:

print("Hey, I am a __init__.py file")

那么,如果我们在init_test.py中内容如下:

from a_pkg import *

执行init_test.py我们可以得到如下结果:

Hey, I am a __init__.py file

因为在from a_pkg import *时候,会首先执行a_pkg目录下的__init__.py文件。

2.3、在__init__.py文件中定义变量或者方法,可以被直接导入使用

还是上面的目录,假如我们在a_pkg目录下的a.py定义如下内容:

def a_method():

print("I am a_pkg!")

在a_pkg目录下的__init__.py文件定义:

from a_pkg.a import a_method

那么,我们在init_test.py中引入a_pkg可以直接引入a_method方法:

from init_example.a_pkg import a_method a_method()

会打印如下内容:

I am a_pkg!

2.4、在__init__.py文件中使用__all__方法

__all__方法可以在__init__.py文件定义一些包或者变量,可以在使用

from init_example.a_pkg import *

时定义*表达的内容。

例如还是上面的内容,但是我们在a_pkg目录下的__init__.py文件定义:

__all__ = ["a"]

那么,我们在init_test.py中使用下面的语句可以引入a模块:

from a_pkg import *

a.a_method()

这时候依然会打印如下内容:

I am a_pkg!

Python包中__init__.py文件的作用和用法相关推荐

  1. Python模块包中__init__.py文件的作用(转载)

    用django做开发已经一年多的时间,但基本没注意python模块中__init__.py文件存在的意义,偶然看到对它的介绍吓一大跳,这个文件太重要了 模块包: 包通常总是一个目录,目录下为首的一个文 ...

  2. Python模块包中__init__.py文件的作用

    2019独角兽企业重金招聘Python工程师标准>>> 在eclipse中用pydev开发Python脚本时,我遇到了一个这样的现象,当我新建一个pydev package时,总会自 ...

  3. python模块 init py_Python模块包中__init__.py文件的作用

    在eclipse中用pydev开发Python脚本时,我遇到了一个这样的现象,当我新建一个pydev package时,总会自动地生成一个空的__init__.py文件,因为是python新手,所以很 ...

  4. python包的init文件_Python模块包中__init__.py文件功能分析

    本文实例讲述了Python模块包中__init__.py文件功能.分享给大家供大家参考,具体如下: 用django做开发已经一年多的时间,但基本没注意python模块中__init__.py文件存在的 ...

  5. from import 导入时找不到module的解决办法(Python模块包中_init_.py文件的作用)

    文章目录 背景 正文 Ⅰ.报错信息 Ⅱ.问题解决 Ⅲ.问题分析 Ⅳ._init_.py文件作用 背景 最近在使用Pycharm开发python脚本时,遇到这样一个现象:打开别人给的工程,环境配置都没有 ...

  6. python中__init__文件的运用_python中__init__.py文件的作用

    1.很多地方的文件夹都有__init__.py.网上一般都说,有了这个东西会把它当作一个包,否则import这个文件夹会出错. 但这就好像和说python文件中如果有中文就要在开头写 # coding ...

  7. Python包和__init__.py文件

    在eclipse中用pydev开发python脚本时,当新建一个package时,系统会自动地生成一个空的__init__.py文件.如果把这个文件删掉,那么你会发现包图标自动变为文件夹图标.这是怎么 ...

  8. init自定义python_Python自定义Module中__init__.py文件介绍

    ./pyModuleTest/ ├── addutil │   ├── add.py │   ├── add.pyc │   ├── __init__.py │   ├── __init__.pyc ...

  9. Python中__main__.py文件的作用

    当我们创建一个Python包时,会有一个__init__.py文件,它是用来标识Python包的,用来与普通文件夹做区分. 我们同样可以在一个Python包中创建一个__main__.py文件,类似于 ...

最新文章

  1. 整个世界都是你的绿幕:这个视频抠图换背景的方法着实真假难辨
  2. 独家 | 将人们困于贫穷之中的隐藏算法战争即将到来
  3. 软件开发行业,年轻与大龄程序员的生存现状
  4. MYSQL升级5.7.10后GROUP BY语句出错解决方法
  5. C++基础复习——C++语言数据类型
  6. 二叉树非递归后序遍历算法
  7. Qt|Linux工作笔记-第二种方式读取Linux中top命令(直接读取,非重定向)
  8. MySQL分库、分表、分区的区别
  9. VMware 15 上Mac虚拟机卡顿情况的优化
  10. java方法调用制作万年历,基于JAVA的万年历api调用代码实例
  11. IDEA插件系列(67):ReadHub插件——新闻阅读器
  12. 细数网易云音乐上那些适合开车时听的歌单。
  13. Android大厂面试真题解析大全,安卓未来路在何方
  14. 比搞笑诺奖还离谱,看完国产AIGC最新创作,把我给整不会了
  15. 如何用python的turtle画五角星_海龟编辑器五角星怎么画 绘制五角星就是这么简单...
  16. 【电气专业知识问答】问:电力系统稳定器PSS的定义和功能是什么?投用时应注意哪些问题?
  17. 大炮打蚊子(c语言易懂版)
  18. 开一个水果店如何进货呢,水果店进货多少
  19. 建筑施工技术【21】
  20. Spring实战第五版源码

热门文章

  1. 基于微信小程序的高校图书共享平台
  2. 为什么以及如何通过机器人学习编程和项目实践
  3. python 导入的nan怎么解决_如何在Python中使用Lmfit解决NaN值错误
  4. 洛谷 P2350 [HAOI2012]外星人(素因子分解,欧拉函数)
  5. 实现一个脚本引擎(燕良译)- -
  6. use glyphs icons
  7. 为什么http请求会缓存?显示from disk cache?
  8. 微软官方提供的免费正版的虚拟机
  9. Celery定时任务
  10. 圆角装饰条_护角条是圆角好还是直角好