一 包
在我们的项目中,可能会有太多的模块,但是我们不能把所有的模块这样放在这里,这样项目会乱七八糟。
我们可以将所有相同类型的模块放在一个文件夹中,这个文件夹就叫做包
包就是文件夹,他用于存放文件也就是模块。包中也可以存放包。
包就是包含了一个__init__.py文件的文件夹
包只是模块的一种形式而已,包即模块
二 包的导入
- 关于包相关的导入语句也分为import和from…import…两种,但是无论哪种,无论在什么位置,再导入时都必须遵循一个原则:凡是在导入时带点的,如demo01.demo02.demo03.,但是都必须遵守这个原则。
- 对于导入后,在使用时就没有这样的限制了。点的左边可以是包,模块,函数,类(他们都可以用点的方式调整自己的属性)
- 对比import demo 和 form demo import name 的应用场景:如果我们想直接使用name 那必须使用后者
1 import 导入
import python1224.demo01.demo01_test01
python1224.demo01.demo01_test01.test01()
2 from…import…导入
1.from 包名.模块名… import 变量名
使用方式: 例如 变量名() 或者print(变量名)
2.from 包名.模块名… import 变量名1,变量名2,…
使用方式: 例如 变量名1() 或者print(变量名2)
3.from 包名 import 模块名
使用方式:模块名.变量名() 或者 print(模块名.变量名)
4.from 包名 import 模块名,模块名1…
使用方式:模块名.变量名() 或者 print(模块名1.变量名)
#导入多个变量
from python1224.demo01.demo01_test01 import test01,test001
test01()
test001()
from 包名 import 模块名
from python1224.demo01 import demo01_test01
demo01_test01.test01()
导入多个模块
from python1224.demo01 import demo01_test01,demo02_test01
demo01_test01.test01()
demo02_test01.test02()
注意: 需要注意的是from后import导入的模块,必须是明确的一个不能带点,否则会有语法错误,如:from a import b.c 语法错误
3 init.py 文件
不管是哪种方试,只要是第一次导入包或者是包的任何其他部分,都会依次执行包下的__init__.py 文件(我们可以在每个包的文件内都打印一行内容来验证一下),这个文件可以为空,但是可也以存放一些初始化包的代码。
4 form包 import * 导入所有的模块
此处是想从包one中导入所有,实际上该语句只会导入包one下__init__.py文件中定义的名字,我们可以在这个文件中定义__all___:
不能导入 demo02包 中的所有模块,只能导入__init__中的内容init() 就可以
三、包的相对和绝对导入
我们的最顶级包pathon1224是写给别人用的,然后在pathon1224包内部也会有彼此之间互相导入的需求,这时候就有绝对导入和相对导入两种方式:
绝对导入:以pathon1224作为起始
相对导入:用.或者…的方式最为起始(只能在一个包中使用,不能用于不同目录内)
相对路径运行注意事项
在没有明确指定包结构的情况下,Python 是根据 name 来决定一个模块在包中的结构的,如果是 main 则它本身是顶层模块,没有包结构,如果是base.demo01.demo02 结构,那么顶层模块是 base。
如果是相对导入,一个模块必须有包结构且只能导入它的顶层模块内部的模块
如果一个模块被直接运行,则它自己为顶层模块,不存在层次结构,所以找不到其他的相对路径。
四、import 导入自定义包的子模块
特别需要注意的是:可以用import导入内置或者第三方模块(已经在sys.path中)但是要绝对避免使用import来导入自定义包的子模块(没有在sys.path中)应该使用from…import…的绝对导入或者相对导入