模块与包
1 #my_module.py 2 print('from the my_module.py') 3 4 name = 'wang' 5 6 def read1(): 7 print('my_module_read1') 8 9 10 def read2(): 11 print('my_module_read2')
在import的过程中发生了哪些事情呢
寻找模块
找到之后开辟空间,然后执行模块
把这个模块中用到的名字都收录到新开辟的空间中
创建一个变量来引用这个模块的空间
import一个模块相当于执行了这个模块
模块不会被重复导入
1 import my_module #只在第一次导入时才执行my_module.py内代码, 2 #此处的显式效果是只打印一次'from the my_module.py', 3 #当然其他的顶级代码也都被执行了,只不过没有显示效果. 4 import my_module 5 import my_module 6 import my_module 7 8 ''' 9 执行结果: 10 from the my_module.py 11 '''
模块和文件之间的内存空间始终是隔离的
模块的名字必须是符合变量命名规范的
可以导入多个模块,但是要遵循pep8规范,三种模块类型分开写
可以通过import 模块名 as 名 来给模块起别名
1 #选择写入文件的模式是json还是pickle 2 def dump(method): 3 if method == 'json': 4 import json 5 with open('file', 'w')as f: 6 json.dump([1, 2, 3], f) 7 elif method == 'pickle': 8 import pickle 9 with open('file', 'w')as f: 10 pickle.dump([1, 2, 3], f) 11 12 #节省代码 13 def dump(method): 14 if method == 'json': 15 import json as s #给json起一个别名s 16 elif method == 'pickle': 17 import pickle as s #给pickle起一个别名s 18 with open('file', 'w')as f: 19 s.dump([1, 2, 3],f ) #无论是哪个,都可以直接用
模块搜索路径
正常的sys.path中除了内置、扩展模块所在的路径外,只有一个路径永远不会出问题,就是你执行的这个文件所在的目录。
一个模块能否被导入,就看这个模块所在的目录中在不在sys.path中
两种运行一个py文件的方式:
直接运行:python脚本 __name__ = __main__
导入:模块 __name__ = 模块名
from import
1 from my_module import name #直接引用模块中name 2 from my_module import read1 #直接引用read1 3 4 name = 'xiaoming' 5 from my_module import name 6 print(name) #从下往上,就近找,第一次的name 7 8 from my_module import name,read1,read1 #可以一次引用多个 9 from my_module import name as n,read1 as r1,read1 as r2 10 #可以给引用的多个分别起别名 11 12 from my_module import * 13 # * 代表的是模块空间所有的东西全部引用 14 # * 如果模块中有__all__=[],则引用列表里的所有
模块的修改
1 import time 2 import my_module 3 print(my_module.name) #wang 4 time.sleep(10) #十秒后继续执行 5 print(my_module.name) #wang 6 # 先打印name,十秒睡眠时间在模块修改name,十秒之后在打印不变 7 #打印name时已经将name加到内存空间,所以在同一次执行时不会改变 8 9 10 from imaplib import reload 11 import time 12 import my_module 13 print(my_module.name) 14 time.sleep(10) 15 reload(my_module) 16 print(my_module.name) 17 #在十秒睡眠时间修改name,然后通过reload方法重新执行模块,name就会改变
包
包是一种通过使用‘模块名’来组织python模块名称空间的方式
包其实就是文件夹,用来存储py文件(本质上就是包含__init__.py文件的文件夹)
无论是import还是from import形式,凡是在导入语句中(不是使用中)遇到带点的要注意,这是包才有的导入方法
import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字也是来源于文件,即包下的__init__.py,导入包本质就是导入该文件
注意:在python3.x中,即使包下没有__init__方法,import包也不会报错,python2.x则会报错
创建包的目的不是运行,而是被导入使用,包只是模块的一种形式,包即模块
导入时必须遵循一个原则:凡是导入时带点的,点的左边都必须是一个包
导入包的过程中相当于执行了这个包的__init__.py文件
绝对导入:sys.path中的内容,永远都是当前你执行的文件
1 glance/ 2 3 ├── __init__.py from glance import api 4 from glance import cmd 5 from glance import db 6 7 ├── api 8 9 │ ├── __init__.py from glance.api import policy 10 from glance.api import versions 11 12 │ ├── policy.py 13 14 │ └── versions.py 15 16 ├── cmd from glance.cmd import manage 17 18 │ ├── __init__.py 19 20 │ └── manage.py 21 22 └── db from glance.db import models 23 24 ├── __init__.py 25 26 └── models.py
相对导入:运用了相对导入的文件不能被直接执行。一个点表示当前目录,两个点表示上一级目录
1 glance/ 2 3 ├── __init__.py from . import api #.表示当前目录 4 from . import cmd 5 from . import db 6 7 ├── api 8 9 │ ├── __init__.py from . import policy 10 from . import versions 11 12 │ ├── policy.py 13 14 │ └── versions.py 15 16 ├── cmd 17 18 │ ├── __init__.py from . import manage 19 20 │ └── manage.py from ..api import policy 21 #..表示上一级目录,想再manage中使用policy中的方法就需要回到上一级glance目录往下找api包,从api导入policy 22 23 └── db 24 25 ├── __init__.py from . import models 26 27 └── models.py

浙公网安备 33010602011771号