Chinaunix首页 | 论坛 | 博客
  • 博客访问: 226381
  • 博文数量: 96
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 0
  • 用 户 组: 普通用户
  • 注册时间: 2016-07-14 11:43
文章分类

全部博文(96)

文章存档

2016年(41)

2015年(55)

我的朋友

分类: Python/Ruby

2015-12-16 17:55:34

1. 基本概念
  模块,在Python可理解为对应于一个文件。在创建了一个脚本文件后,定义了某些函数和变量。你在其他需要这些功能的文件中,导入这模块,就可重用这些函数和变量。一般用module_name.fun_name,和module_name.var_name进行使用。这样的语义用法使模块看起来很像类或者名字空间,可将module_name 理解为名字限定符。模块名就是文件名去掉.py后缀。下面演示了一个简单的例子:

点击(此处)折叠或打开

  1. #moduel1.py
  2. def say(word):
  3.     print word

  4. #caller.py
  5. import module1

  6. print __name__
  7. print module1.__name__
  8. module1.say('hello')
$ python caller.py
__main__
module1
hello

例子中演示了从文件中调用模块的方法。这里还展示了一个有趣的模块属性__name__,它的值由Python解释器设定。如果 脚本文件是作为主程序调用,其值就设为__main__,如果是作为模块被其他文件导入,它的值就是其文件名。这个属性非常有用,常可用来进行模块内置测 试使用,你会经常在一些地方看到类似于下面的写法,这些语句只在作为主程序调用时才被执行。

if __name__ == '__main__':
    app = wxapp(0)
    app.MainLoop()

2. 模块搜索路径


上面的例子中,当module1被导入后,python解释器就在当前目录下寻找module1.py的文件,然后再从环境变量寻找,如果这环境变量没有设定,也不要紧,解释器还会在安装预先设定的的一些目录寻找。这就是在导入下面这些标准模块,一切美好事情能发生的原因。
import os
import sys
import threading
...
这些搜索目录可在运行时动态改变,比如将module1.py不放在当前目录,而放在一个冷僻的角落里。这里你就需要通过某种途径,如sys.path, 来告知Python了。sys.path返回的是模块搜索列表,通过前后的输出对比和代码,应能理悟到如何增加新路径的方法了吧。非常简单,就是使用 list的append()或insert()增加新的目录。

点击(此处)折叠或打开

  1. #module2.py
  2. import sys
  3. import os

  4. print sys.path
  5. workpath = os.path.dirname(os.path.abspath(sys.argv[0]))
  6. sys.path.insert(0, os.path.join(workpath, 'modules'))
  7. print sys.path
$ python module2.py
['e:\\Project\\Python', 'C:\\WINDOWS\\system32\\python25.zip', ...]
['e:\\Project\\Python\\modules', 'e:\\Project\\Python', 'C:\\WINDOWS\\system32\\python25.zip', ...]
3. 模块中的可执行语句

模块能像包含函数定义一样,可包含一些可执行语句。这些可执行语句通常用来进行模块的初始化工作。这些语句只在模块第一次被导入时被执行。这非常重要,有些人以为这些语句会多次导入多次执行,其实不然。

模块在被导入执行时,python解释器为加快程序的启动速度,会在与模块文件同一目录下生成.pyc文件。我们知道python是解释性的脚本语言,而.pyc是经过编译后的字节码,这一工作会自动完成,而无需程序员手动执行。

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

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

单行导入

1
from module import name1,name2,name3

多行导入

1
2
from module import name1,name2,\
                   name3

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

1
from module import *


阅读(471) | 评论(0) | 转发(0) |
0

上一篇:python 函数

下一篇:python 包

给主人留下些什么吧!~~