网站首页 > 技术文章 正文
在Python工程中,我们经常可以看到带有“__init__.py”文件的目录,在PyCharm中,带有这个文件的目录被认为是Python的包目录,与目录的图标有不一样的显示。如下图所示,「链接」dir_example是一个空白目录,图标是个文件夹图标,而init_example下有_init__.py文件,其图标是一个包。
那么这个文件的作用是什么,我们平时如何使用呢,这篇文章将解释这个问题。
- 一、__init__.py文件简介
- 二、__init__.py文件的使用案例
- 2.1、没有__init__.py文件的目录,使用import xx.xx会报错吗?
- 2.2、在__init__.py文件中定义变量或者逻辑将在导入时候被执行
- 2.3、在__init__.py文件中定义变量或者方法,可以被直接导入使用
- 2.4、在__init__.py文件中使用__all__方法
一、__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!
猜你喜欢
- 2025-03-17 一文掌握在 Python 中保存和加载 JSON 文件
- 2025-03-17 轻松玩转Python文件操作:移动、删除
- 2025-03-17 Python 文件处理指南(python文件的操作步骤)
- 2025-03-17 python基础—pip指定包安装目录(pythonpip安装的默认路径)
- 2025-03-17 Python小案例55- os模块执行文件路径
- 2025-03-17 Python写入Excel表格模块:xlwt介绍
- 2025-03-17 Python 的标准库shutil: 优雅的文件和目录操作
- 2025-03-17 Python OS 库基础知识(os.python)
- 2025-03-17 Python 文件操作:从基础到实践(python如何进行文件操作)
- 2025-03-17 Python 模块详解教程(python模块总结)
- 05-25Python 3.14 t-string 要来了,它与 f-string 有何不同?
- 05-25Python基础元素语法总结
- 05-25Python中的变量是什么东西?
- 05-25新手常见的python报错及解决方案
- 05-2511-Python变量
- 05-2510个每个人都是需要知道Python问题
- 05-25Python编程:轻松掌握函数定义、类型及其参数传递方式
- 05-25Python基础语法
- 257℃Python短文,Python中的嵌套条件语句(六)
- 257℃python笔记:for循环嵌套。end=""的作用,图形打印
- 256℃PythonNet:实现Python与.Net代码相互调用!
- 251℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 251℃Python实现字符串小写转大写并写入文件
- 106℃原来2025是完美的平方年,一起探索六种平方的算吧
- 91℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 81℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 最近发表
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)