码迷,mamicode.com
首页 > 编程语言 > 详细

python基础教程总结9——模块,包,标准库

时间:2015-07-22 12:13:20      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:

1. 模块

  在python中一个文件可以被看成一个独立模块,而包对应着文件夹,模块把python代码分成一些有组织的代码段,通过导入的方式实现代码重用。

1.1 模块搜索路径

  导入模块时,是按照sys.path变量的值搜索模块,sys.path的值是包含每一个独立路径的列表,包含当前目录、python安装目录、PYTHONPATH环境变量,搜索顺序按照路径在列表中的顺序(一般当前目录优先级最高)。

1 >>> import sys
2 >>> sys.path
3 [‘‘, E:\\Python27\\Lib\\idlelib, C:\\windows\\system32\\python27.zip, E:\\Python27\\DLLs, E:\\Python27\\lib, E:\\Python27\\lib\\plat-win, E:\\Python27\\lib\\lib-tk, E:\\Python27, E:\\Python27\\lib\\site-packages]

1.2 导入模块

1.2.1 使用import语句导入模块

  有下面两种方式

import module1
import module2
import module3

import module1,module2,module3
 

  这两种方式的效果是一样的,但是第一种可读性比第二种好,推荐按照下面的顺序导入模块,并且一般在文件首部导入所有的模块 

  • python标准库
  • 第三方模块
  • 应用程序自定义模块

  也可以在函数内部导入模块,这样被导入的模块作用域是局部的

 

1.2.2 使用from-import语句导入模块的属性

  单行导入

1 from module import name1,name2,name3 

  多行导入

from module import name1,name2,                   name3

  导入全部属性(由于容易覆盖当前名称空间中现有的名字,所以一般不推荐使用,适合模块中变量名很长并且变量很多的情况)

 1 from module import * 

  如果你不想某个模块的属性被以上方法导入,可以给该属性名称前加一个下划线(_test),如果需要取消隐藏,可以显示的导入该属性(from module import _test)

 

1.2.3 扩展的import语句
  使用自定义的名称替换模块的原始名称

import simplejson as json

  模块被导入时,加载的时候模块顶层代码会被执行,如:设定全局变量、类和函数的声明等,所以应该把代码尽量封装到类和函数中。一个模块无论被导入多少次,只加载一次,可以防止多次导入时代码被多次执行。

 

1.2.4 重新导入模块reroad

1)import

  import作用:导入/引入一个python标准模块,其中包括.py文件、带有__init__.py文件的目录。

import module_name[,module1,...]  
from module import *|child[,child1,...]  
 

  说明:多次重复使用import语句时,不会重新加载被指定的模块,只是把对该模块的内存地址给引用到本地变量环境。
  

a.py  
#!/usr/bin/env python    
#encoding: utf-8  
import os  
print ‘in a‘,id(os)  
  
m.py  
#!/usr/bin/env python    
#encoding: utf-8  
import a   #第一次会打印a里面的语句  
import os  #再次导入os后,其内存地址和a里面的是一样的,因此这里只是对os的本地引用  
print ‘in c‘,id(os)  
import a  #第二次不会打印a里面的语句,因为没有重新加载  

#结果

in a 23124144
in c 23124144

  

 

2)reroad
  作用:对已经加载的模块进行重新加载,一般用于原模块有变化等特殊情况,reload前该模块必须已经import过。

import os
reload(os)

  说明:reload会重新加载已加载的模块,但原来已经使用的实例还是会使用旧的模块,而新生产的实例会使用新的模块;

     reload后还是用原来的内存地址;

     不能支持from。。import。。格式的模块进行重新加载。

 1 a.py  
 2 #!/usr/bin/env python    
 3 #encoding: utf-8  
 4 import os  
 5 print in a,id(os)  
 6   
 7 m.py  
 8 #!/usr/bin/env python    
 9 #encoding: utf-8  
10 import a   #第一次import会打印a里面的语句  
11 print id(a) #原来a的内存地址  
12 reload(a)  #第二次reload还会打印a里面的语句,因为有重新加载  
13 print id(a) #reload后a的内存地址,和原来一样  

#结果

>>>
in a 23058608
29617680
in a 23058608
29617680
>>>

 

 

2. 包

  包是另外一种模块,可以包含其他模块;

  模块存储在文件中时(拓展名.py),包就是模块所在的目录;

  包必须包括一个__init__.py的文件(模块),若将其作为普通模块导入文件内容就是包的内容

#名为constants的包,文件constants/__init__.py包括语句PI=3.14

import constants
print constants.PI

  为了将模块放置在包内,直接把模块放在包目录内即可:

  技术分享

 

技术分享

 
1
 

3. 指定python文件编码方式
python默认是使用ASCII编码,可以指定编码方式,如

1
2
#!/usr/bin/env python
#coding=utf-8

或者

1
2
#!/usr/bin/env python
# -*- coding:utf-8 -*-

4. 解决导入循环问题
有下面两个模块,a.py和b.py
a.py

1
2
3
4
5
6
7
#!/usr/bin/env python
#coding=utf-8
 
import b
 
if __name__ == ‘__main‘:
    print ‘hello,I‘m a‘
1
b.py
1
2
3
4
5
6
7
#!/usr/bin/env python
#coding=utf-8
 
import a
 
if __name__ == ‘__main‘:
    print ‘hello,I‘m b‘

在这里a尝试导入b,而b也尝试导入a,导入一个先前没有完全导入的模块,会导致导入失败。解决办法:移除一个导入语句,把导入语句放到函数内部,在需要的时候导入。
b.py

1
2
3
4
5
6
#!/usr/bin/env python
#coding=utf-8
 
if __name__ == ‘__main‘:
    import a
    print ‘hello,I‘m b‘

5. 使用技巧
创建一个目录python_apps,编辑~/.bashrc,设定环境变量PYTHONPATH的值为该目录的路径。

1
export PYTHONPATH=/home/zhoujh/python_apps:$PYTHONPATH

然后在python_apps目录下做一个软链接至应用的目录,假如要运行的应用路径为:/home/zhoujh/python_workspace/app

1
ln -s /home/zhoujh/python_workspace/app ./app

这样以后添加新的应用,只需在该目录下创建一个链接就行。

 

 

python基础教程总结9——模块,包,标准库

标签:

原文地址:http://www.cnblogs.com/zxqstrong/p/4666646.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!