模块用于定义

Q1 模块在第一次导入的时候做了什么?

  1. 定义函数
  2. 定义类
  3. 定义赋值后的变量

于是上面的函数、类、赋值后的变量就成了它的特性.

Q2 如何区分它是被导入还是被直接执行?

被导入的时候:__name__值是模块的名字 被直接执行的时候:__name__值是__main__

如何让模块可用

可用:是指在import你的模块的时候解释器能够找到你的模块,才能在解释器里使用。

  1. 把模块放在解释器找得到的位置
# sys.path的目录就是解释器的搜索路径,pprint提供智能打印:打印出来的目录都可以放,推荐放site-packages目录
import sys,pprint
pprint.pprint(sys.path)
  1. 告诉解释器去哪里找
# 编辑sys.path(并不通用)
sys.path.append('c:/python')
# PYTHONPATH的环境变量配置(在每次登录都要执行的shell文件中设置环境变量)
vim ~/.bashrc
export PYTHONPATH=$PYTHONPATH:~/python;~/genedock # (路径以分号分割就好)

包的本质:包也是模块。模块存在文件中,包就是模块的目录,为了让Python把它当包对待,需要含一个名为__init__.py的文件。

# 引入drawing包中的__init__模块
import drawing
# drawing中的colors模块可用,且只能带包名引用
import drawing.colors
# drawing中的shapes模块可用,可以不带包名用
from drawing import shapes
# drawing.__all__变量中的公有接口;如果没有,导入非下划线开头的全局名称
from drawing import *

探究模块

  1. 模块中有什么
# 使用dir:列出对象所有的特性(函数、类、变量),有些已_开头表示约定不是外部使用的
[n for n in dir(copy) if not n.startswith('_')]
输出:['Error', 'PyStringMap', 'copy', 'deepcopy', 'dispatch_table', 'error', 'name', 't', 'weakref']

# __all__变量:定义模块的公有接口
copy.__all__
输出:['Error', 'copy', 'deepcopy']
  1. 文档

当你的需求非常小:range的参数是什么?

print range.__doc__

如果需要更详细的文档,参考官方库。

  1. 使用源代码
# 模拟解释器import模块的时候去找
sys.path
# 检查模块的__file__属性
print copy.__file__