模块与包

 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 )   #无论是哪个,都可以直接用
别名as

模块搜索路径

正常的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
相对导入

 

posted @ 2018-09-07 16:35  .why  阅读(199)  评论(0)    收藏  举报
Live2D