模块和包:
1.如何自己写一个模块
import 模块名
模块的导入相当于这个模块所在的文件,模块的多次导入不会重复执行
命名空间
为模块起别名 as 语句
一行导入多个模块 : 内置 第三方 自定义
from import
命名空间 名字引用模块中的名字
为导入的名字起别名
一行导入多个名字
*和__all__的关系 : __all__只能约束*
示例文件:自定义模块my_module.py,文件名my_module.py,模块名my_module
#my_module.py print('from the my_module.py') money=1000 def read1(): print('my_module->read1->money',money) def read2(): print('my_module->read2 calling read1') read1() def change(): global money money=0
模块可以包含可执行的语句和函数的定义,这些语句的目的是初始化模块,它们只在模块名第一次遇到导入import语句时才执行(import语句是可以在程序中的任意位置使用的,且针对同一个模块很import多次,为了防止你重复导入,python的优化手段是:第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载大内存中的模块对象增加了一次引用,不会重新执行模块内的语句),如下
#demo.py import my_module #只在第一次导入时才执行my_module.py内代码,此处的显式效果是只打印一次
#'from the my_module.py',当然其他的顶级代码也都被执行了,只不过没有显示效果. import my_module import my_module import my_module ''' 执行结果: from the my_module.py '''
模块引用中的情况 :
1.模块的循环引用 ***
模块之间不允许循环引用
2.模块的加载与修改 *
已经被导入的模块发生了修改,是不会被感知到的
要想修改的模块被正在运行中的程序感知到,重启这个程序
3.把模块当成脚本执行 *****
if __name__ == '__main__':
代码
写在这里面的代码只有这个文件被当做脚本执行的时候才执行
4.模块的搜索路径 *****
和被当做脚本执行的文件 同目录下的模块,可以被直接导入
除此之外其他路径下的模块 在被导入的时候需要自己修改sys.path列表
包:
包是一种通过使用‘.模块名’来组织python模块名称空间的方式。
1. 无论是import形式还是from...import形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高警觉:这是关于包才有的导入语法
2. 包是目录级的(文件夹级),文件夹是用来组成py文件(包的本质就是一个包含__init__.py文件的目录)
3. import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件
强调:
1. 在python3中,即使包下没有__init__.py文件,import 包仍然不会报错,而在python2中,包下一定要有该文件,否则import 包报错
2. 创建包的目的不是为了运行,而是被导入使用,记住,包只是模块的一种形式而已,包即模块
从包中导入模块:
import import glance.api.policy glance.api.policy.get() import glance.api.policy as policy policy.get() from import from glance.api import policy policy.get() from glance.api.policy import get get()