数据学习
登录
注册
原创博客
期刊会议
学术世界
期刊出版社
领域期刊
SCI/SCIE/SSCI/EI简介
期刊列表
会议列表
所有期刊分区
学术期刊信息检索
JCR期刊分区查询
CiteScore期刊分区查询
中科院期刊分区查询
领域期刊分区
管理 - UTD24期刊列表
管理 - AJG(ABS)期刊星级查询
管理 - FMS推荐期刊列表
计算机 - CCF推荐期刊会议列表
高校期刊分区
南大核心(CSSCI)
合工大小核心
合工大大核心
AI资源仓库
AI领域与任务
AI研究机构
AI学术期刊
AI论文快讯
AI数据集
AI开源工具
AI模型
AI模型概览图
AI模型月报
AI基础大模型
AI预训练大模型
数据推荐
网址导航
我的网址导航
程序员必备网站
Python包中__init__.py文件的作用和用法
标签:
#python#
#编程#
时间:2021/10/16 21:42:55
作者:小木
在Python工程中,我们经常可以看到带有“\_\_init\_\_.py”文件的目录,在PyCharm中,带有这个文件的目录被认为是Python的包目录,与目录的图标有不一样的显示。如下图所示,dir_example是一个空白目录,图标是个文件夹图标,而init_example下有\_\_init\_\_.py文件,其图标是一个包。

那么这个文件的作用是什么,我们平时如何使用呢,这篇文章将解释这个问题。

[TOC] #### 一、\_\_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个: 1. 当目录下包含这个文件时,Python会将其当作成包目录,进而可以使用`import xx.xx`的方式导入目录下的文件或者模块。 2. 使用\_\_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文件定义: ```python print("Hey, I am a __init__.py file") ``` 那么,如果我们在init\_test.py中内容如下: ```python 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定义如下内容: ```python def a_method(): print("I am a_pkg!") ``` 在a\_pkg目录下的\_\_init\_\_.py文件定义: ```python from a_pkg.a import a_method ``` 那么,我们在init\_test.py中引入a_pkg可以直接引入`a_method`方法: ```python from init_example.a_pkg import a_method a_method() ``` 会打印如下内容: ```python 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模块: ```python from a_pkg import * a.a_method() ``` 这时候依然会打印如下内容: ```python I am a_pkg! ```
欢迎大家关注DataLearner官方微信,接受最新的AI技术推送
相关博客
最热博客