首先理解一下基本概念:
- 模块(module):其实就是一个py文件,里面定义了各种变量,函数,类。
- 包(package):一个文件夹就是一个package,package里面可包含xx.py、xx.pyc等文件。
- 元素(element):module里面的定义的变量啊、类啊等。
是否必须有__init__.py文件 ?
答:不是。
- Python2的package下面必须有__init__.py文件,否则import package的时候会报错
- 但是Python3可有可无
init.py文件的作用?
Python2中导入包时会执行包下面的__init__.py文件,而Python3在导入包的时候如果有__init__.py文件就执行,如果没有就不执行。
导入元素的方法
-
导入包
方法: import package
程序执行的动作:执行package下面的__init__.py文件(Python3如果没有该文件就什么也不做),无法访问包下面的Python文件。 -
导入模块
方法1:from package1.package2.package3 import modle
方法2: import package1.package1.package1.modle
2种导入方法等效。
程序执行的动作:首先依次执行package1、package2、package3下面的__init__.py文件(Python3有就执行,没有就不执行),然后执行modle文件。无法访问Python文件里面的变量和方法。 -
导入元素(.py文件中的某个变量、某个类等)
导入变量:from packge.modle import my_element
导入方法:from packge.modle import my_function
程序执行的动作:首先执行package下面的__init__.py文件(Python3有就执行,没有就不执行),然后执行modle文件。然后就可以在你的文件中直接使用变量my_element和方法my_function了。( eg:print(my_element); )
一般情况下,我们导入模块都是为了使用其中定义的变量或者方法,所以需要使用最后一种方法。也可简写为rom packge.modle import * 以导入modle中的全部变量和方法。
—init—.py文件会自动执行几次?
答:仅一次。举个栗子:
1、首先我们看一下例子的目录结构
[root@localhost test]# tree haha
haha
├── pack1
│ ├── —init—.py #这里本来是下滑线的,但是Markdone中不允许我这么写,我暂时还不会哈。
│ ├── me.py
└── test.py
2、看看我们的test.py
from pack1.me import *
//your codes
import pack1
import pack1.me
按照上面的说明,这个代码片段执行时,会执行3次pack1的__init__.py文件,执行2次me.py。
然而实际却是,执行了 1 次pack1的__init__.py文件,执行了2次me.py。即,init.py仅在一个modle中第一次导入时会执行。