| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 开发工具 -> Python包中__init__.py文件的作用和用法 -> 正文阅读 |
|
[开发工具]Python包中__init__.py文件的作用和用法 |
在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! |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/23 19:09:00- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |