ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python中的__init__.py

2022-06-17 22:36:52  阅读:139  来源: 互联网

标签:__ __. Python py init pkg 目录


  在Python工程中,我们经常可以看到带有“__init__.py”文件的目录,在PyCharm中,带有这个文件的目录被认为是Python的包目录,与目录的图标有不一样的显示。如下图所示, “序列化”是一个空白目录,图标是个文件夹图标,而“模块介绍”下有_init__.py文件,其图标是一个包。(在某些破解版pycharm没有显示。)

  

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

 

1.__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文件可以控制模块导入时的变量和内容,便于编程者的控制。

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

 

2.__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,py,init,pkg,目录
来源: https://www.cnblogs.com/lizexiong/p/16387180.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有