1.模块使用
1.1 import语句
使用import,首次导入模块会做三件事:
- 执行源文件代码
- 产生一个新的名称空间用于存放源文件执行过程中产生的名字
- 在当前执行文件所在的名称空间中等到一个名字foo,该名字指向新创建的模块名称空间,若引用模块名称空间中的名字,需要加上该前缀。
import foo 导入模块foo
a = foo.x 引用模块中变量x的值赋值给当前名称空间中的名字a
foo.get() 调用模块foo的get函数
foo.change() 调用模块foo的change函数
obj = foo.Foo() 使用模块foo的类Foo来实例化,进一步可以执行obj.func()
强调:第一次导入模块已经将其加载到内在空间了,之后的重复导入会直接引用内存中已存在的模块。
无论是import 还是from ... import在导入模块时都涉及到查找问题
优先级:
- 内存
- 从硬盘找,按照sys.path中的文件所的文件夹
import sys
print(sys.path) 从硬盘找,执照syst.path中的文件所在的文件夹
print(sys.modules) 查看已加载到内存的模块
假如foo这个模块不在同一个文件夹中,可以利用下面的方法导入
import sys
sys.path.append('加载的模块地址')
import foo 现在就可以调用了
2. from -import语句
from ...import 与import 语句基本一致,唯一不同的是:使用import foo导入模块后,引用模块中的名字
需要加上foo.作为前缀,而from fo import x,get,change则可以在当前执行文件中直接引用模块foo名字。
3.其他导入语法(as)
在当前导入的模块起一个别名
import foo as f
from foo import get as get_x
4.区分py文件
if __name__ == '__main__':
foo.py 被当做脚本执行时运行的代码
else:
foo.py 被当做模块导入时运行的代码
5.模块搜索路径
- 模块的查顺序:内存中已经加载的模块>内置模块>sys.path路径中包含的模块
6.包
包的本质就是一具文件夹,即包是含有有__init__.py文件的文件夹,所以我们创建包的目的就是为了用文件夹将文件/模块组织起来。
#1.关于包相关的导入语句也分为import和from ... import ...两种,但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:凡是在导入时带点的,点的左边都必须是一个包,否则非法。可以带有一连串的点,如item.subitem.subsubitem,但都必须遵循这个原则。但对于导入后,在使用时就没有这种限制了,点的左边可以是包,模块,函数,类(它们都可以用点的方式调用自己的属性)。
#2、import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件
#3、包A和包B下有同名模块也不会冲突,如A.a与B.a来自俩个命名空间
- 增加当前文件夹包
import sys
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
sys.path.append(BASE_DIR)