Python项目打包与部署(二): __init__.py的作用及内容

发布时间 2023-09-11 11:20:17作者: 弯弓

其它章节

通常在python项目的源代码子目录下都看到1个__init__.py文件,django-admin startproject 命令生成的项目结构中也有__init__.py文件,
project_structure

那么,为什么要加1个__init__.py`文件,其究竟有什么用,应该向里面写什么内容呢?

1. __init__.py文件的作用

__init__.py文件,如果与类定义相比,它相当于是 python package 的constructor 构造方法, 其作用是,告诉python解释器,要把本目录下哪些的函数导进包,以及这些函数位于哪些文件中。

  • __init__.py文件可以为空.
  • 不能把其它同级目录的文件导入此package中。

2. 如何使用__init__.py

下面用实例来说明 __init__.py 是如何工作的,以及应该写什么内容。

(1)在__init__.py文件中,导入需要的模块

my_package/__init__,.py中,输入以下代码,将此目录下.file1, .file2,.file3文件的函数 func_1, func_2,, func_3 导入包my_package,但不包含其它函数模块

from .file1 import func_1 
# Where func_1 is the name of the function and .file1 is the name of the module/file
from .file2 import func_2
from .file3 import func_3

这种方式,只是导入了代码文件中所需要的模块。

让我们用实例来看看,导入模块的另1种方式:
在package目录下,创建1个main,.py , 在main.py中直接导入整个 my_package,下例中,可以看到,前面例子中没有的,func_5() 也导入了。

import my_package  # this imports the entire module 
# 调用func_1() 
my_package.func_1() 
my_packagee.func_2()
my_packagee.func_3()
my_packagee.func_5()

(2) 设置 __all__ 参数

Python解释器在导入包时,如果 __init__.py中设置__all__ 列表变量, 则 from package import * 语句导入__all__中包含的所有模块或全局变量。如, __all__ = ["func_1", "func_2", "func_3"],然后在 main.py 中 from my_package import * 执行时,最终只有3个模块被导入:

from my_package import *
my_packagee.func_1() 
my_packagee.func_2()
my_packagee.func_3()

在实际编写代码时,尽量不要用import * 来导入包中所有模块与全局变量,以避免未知的命名冲突。

(3) 导入子目录下的包

示例项目文件结构如下:

sample/
├── docs/
├── main.py
├── my_package2/
│   ├── __init__.py
│   └── create.py

如果 main.py中需要调用子目录 my_package2下的create方法, my_package2子目录下必须有1个__init__,py文件,然后才能在main,py中导入, 这就是为什么项目的源代码子目录下总放1个 __init__,py 文件的原因。

main.py 的 import 代码如下:

from my_package2 import create
# or 
importmy_package2.create

----如果不妥之处,欢迎指正---