在Python工程中,我们经常可以看到带有“init.py”文件的目录,在PyCharm中,带有这个文件的目录被认为是Python的包目录,与目录的图标有不一样的显示

简介

Python 定义了两种类型的包,常规包和命名空间包。常规包是传统的包,因为它们存在于 Python 3.2 和更早的版本中。一个常规包通常被实现为一个包含init.py 文件的目录。当一个常规包被导入时,这个init.py文件被隐式执行,它所定义的对象被绑定到包的名字空间中。就是说Python文件都是按照目录当作不同的模块来组织的,这个目录被认为是Python包目录,Python会通过搜索该目录下的文件来导入相关的模块。但是并不是所有的目录都会被搜索添加,只有当目录中包含init.py文件时,这个目录才会被Python当作是一个包目录,进而搜索添加里面的文件。这样做可以让编程者自己控制哪些目录可以被Python导入成包。

作用

  1. 当目录下包含这个文件时,Python会将其当作成包目录,进而可以使用import xx.xx的方式导入目录下的文件或者模块。使用init.py文件可以控制模块导入时的变量和内容,便于编程者的控制。
  2. init.py文件中定义变量或者逻辑将在导入时候被执行
  3. init.py文件中定义变量或者方法,可以被直接导入使用

    使用说明

    假设我们有如下的结构:如果想导入,最直接的方式就是
    image.pngimage.png

    执行代码

    image.png
    1. print('hello, I am __init__.py file')
    2. import mypackage
    3. >>>hello, I am __init__.py file

    控制模块导入

    1. from mypackage.subpackage_1 import test11

    一次性全部导入

    使用all
    1. __all__ = ['subpackage1','subpackage2']
    1. from mypackage import *
    2. dir()
    3. >>['__doc__','__builtins__','__loader__','__name__','__package__','subpackage1','subpackage2']
    子模块中的模块没有导入,该例子等同于from mypackage import subpackage1,subpackage2
    因此我们在subpackage1下面继续添加init.py
    1. __all__ = ['test11','test12']
    2. from mypackage.subpackage1 import test11
    1. from mypackage import *
    2. dir(subpackage1)
    3. >>['test11']
    4. from mypackage.subpackage1 import *
    5. dir()
    6. >>['test11','test12']