模块和包
一、模块
1、什么是模块?? 模块是一组功能的集合,别人写好的函数 变量 方法 放在一个文件里 (这个文件可以被我们直接使用)这个文件就是个模块
2、如何自己写一个模块
创建一个py文件,给它起一个 符合变量名命名规则的名字,这个名字就是模块名
写一个简单的my_module模块
1 name = 'egon' 2 def read1(): 3 print('main read1')
3、调用一个模块
1 import my_module 2 name='Bart' 3 def func(): 4 print('aaaaaaa') 5 print(name) 6 print(my_module.name)
第一行打印:"Brat"
第二行打印:"egon"
当模块被调用时,为模块分配一个内存地址,import的命名空间,模块和当前文件在不同的命名空间中
判断模块是否被导入
1 import sys 2 3 print(sys.modules)
4,模块的导入过程
找到这个模块
判断这个模块是否被导入过了
如果没有被导入过
创建一个属于这个模块的命名空间
让模块的名字 指向 这个空间
执行这个模块中的代码
5、给模块起别名,之后都需要使用别名引用变量了
1 import my_module as m 2 m.read1() 3 4 json pickle 5 dumps loads 6 def func(dic,t = 'json'): 7 if t == 'json': 8 import json 9 return json.dumps(dic) 10 elif t == 'pickle': 11 import pickle 12 return pickle.dumps(dic) 13 14 def func(dic, t='json'): 15 if t == 'json': 16 import json as aaa 17 elif t == 'pickle': 18 import pickle as aaa 19 return aaa.dumps(dic)
导入多个模块
模块顺序:内置模块、第三方模块、自定义莫夸
二、from import .......
1、from.......import.......import谁就只能用谁
1 from import的过程中仍然执行了这个被导入的文件 2 3 from my_module import read1 4 # import谁就只能用谁 5 read1() 6 from my_module import read2 7 read2()
2、当前文件的命名空间和模块的命名空间问题
1 from my_module import read1 2 def read1(): 3 print('in my read1') 4 read1() 5 6 from my_module import read2 7 read2()
当模块和当前命名空间存在相同的变量时,模块里的变量名被覆盖
直接调用当前命名空间变量
from.......import........的过程
# 1.找到要被导入的模块
# 2.判断这个模块是否被导入过
# 3.如果这个模块没被导入过
# 创建一个属于这个模块的命名空间
# 执行这个文件
# 找到你要导入的变量
# 给你要导入的变量创建一个引用,指向要导入的变量
导入多个变量
1 from my_module import read1,read2 2 read1() 3 read2()
给导入的名字起别名:和import是一样的
3、*和__all__
*,from my_module import* 引入所有的变量,可以直接使用(和import my_module相似)
__all__=['变量1 ','变量2 ','变量3 '............]
__all__写在模块里,能够约束*导入的变量的内容,只有写在__all__里的变量才能被使用
三、模块的加载与修改
1、模块之间的循环调用
模块之间不能循环调用,可以单向调用,不能构成回路
2、import......... 加载、修改
已经被导入的模块如果被修改,执行时不会被修改,从新加载启动这个程序执行新的内容
3、将模块当做脚本执行
执行Python的两种方式
1、在cmd里执行、在Python执行这个文件---------->以脚本的方式执行
2、如果导入这个py文件,这个py文件就是模块
当一个py文件
当成脚本的时候,能够独立提供一个功能,能自主完成交互
当成一个模块的时候,能够通过调用执行这个功能,不能自主完成交互
一个文件的__name__变量
当这个文件被当做脚本执行的时候__name__=='__main__'
当这个文件被当做模块导入的时候__name__=='模块的名称'
关键的代码********
if __name__="__main__" pass
当文件被当成脚本执行的时候判断是否是main,如果是就执行这个脚本
当文件被当成模块执行的时候可以直接调用这个功能
模块的搜索路径
导入在同一层下的文件可以直接导入
要导入不同目录下的文件,要加载要导入的文件的目录需要修改sys.path()列表
把要导入的模块的路径添加到列表里
1 import sys 2 path="要导入的模块的路径" 3 sys.path.append(path)
之后可以直接导入这个模块
从包里导入模块
包:文件夹里有一个__init__.py文件,是几个模块的集合
用import /from....import导入包
1 # import 方法引入包 2 import glance.api.policy 3 glance.api.policy.get() 4 #或 5 import glance.api.police as policy 6 policy.get()
1 #点的左边必须是包,否则非法 2 from glance.api import police 3 police.get() 4 #或 5 from glance.api.policy import get 6 get()
包的绝对导入和相对导入
导入一个包不意味着这个包下面的内容都是可以用的
导入一个包的过程:导入一个包就相当于执行了这个包下面的__init__文件
绝对导入:通过设计被导入包下的__init__来完成导入包之后的操作。缺点:当包的路径发生改变,__init__里的文件就发生改变,需要做相应的调整
相对导入:直接从上一级导入