分类: Python/Ruby
1、在Python 需要理解三个概念包、模块、类。
模块对应的是一个.py 文件,module_name 就是这个文件去掉.py 之后的文件名,py 文件中可以声明定义变量、函数、类。
包是一个包含__init__.py 和其他xx.py 模块文件的文件夹。
类是面向对象的概念,同C++面向对象变成语言定义,应用方法相同。
import module_name
from package_name import module_name
from package_name import *
2、import 或引用模块xx.py 时,python 解释器寻找域/命名空间的优先顺序:
1、 当前文件目录
注意当前目录下自实现的模块要声明处理:
#如有个一个SSH.py
#!/usr/bin/python
#coding:utf-8
import os,sys
import socket
class SSH()
"""
"""
pass
#要做如下声明,这样在其他模块import SSH的时候才会找到。
if __name__ == "__main__":
SSH()
2、 环境变量PYTHONPATH
3、 sys.path(list 类型)
#sys.path 是list 类型,我们可以通过insert(), append() 方法来增加模块导入的搜索路径,如:
import sys
path = “……” # 需要增加的路径
sys.path.insert(0, path)
在import模块时,该模块的顶层代码将会被执行一次。如果该模块被import多次,例如import A, import B.其中B模块本身也有import A,那么只在第一次被import的时候顶层代码会被执行。
模块在被导入执行时,python解释器为加快程序的启动速度,会在与模块文件同一目录下生成编译后的字节码.pyc文件。这一工作会自动完成。
3、from module import XXX
- 如果你想要有选择地导入某些属性和方法,而不想要其它的,使用 from module import。
- 如果模块包含的属性和方法与你的某个模块同名,你必须使用 import module 来避免名字冲突。
4、包
在创建许许多多模块后,我们可能希望将某些功能相近的文件组织在同一文件夹下,这里就需要运用包的概念了。包对应于文件夹,使用包的方式跟模块也类似,__init__.py的内容可以为空,一般用来进行包的某些初始化工作或者设置__all__值,__all__是在from package-name import *这语句使用的,全部导出定义过的模块。
为了区分主执行文件还是被调用的文件,Python引入了一个变量__name__,当文件是被调用时,__name__的值为模块名,当文件被执行时,__name__为'__main__'。这个特性,为测试驱动开发提供了极好的支持,我们可以在每个模块中写上测试代码,这些测试代码仅当模块被Python直接执行时才会运行,代码和测试完美的结合在一起。
典型的Python文件结构:
5、python import模块方法
python包含子目录中的模块方法比较简单,关键是能够在sys.path里面找到通向模块文件的路径。
下面将具体介绍几种常用情况:
(1)主程序与模块程序在同一目录下:
如下面程序结构:
`-- src
|-- mod1.py
`-- test1.py
若在程序test1.py中导入模块mod1, 则直接使用import mod1或from mod1 import *;
(2)主程序所在目录是模块所在目录的父(或祖辈)目录
如下面程序结构:
`-- src
|-- mod1.py
|-- mod2
| `-- mod2.py
`-- test1.py
若在程序test1.py中导入模块mod2, 需要在mod2文件夹中建立空文件__init__.py文件(也可以在该文件中自定义输出模块接口); 然后使用 from mod2.mod2 import * 或import mod2.mod2.
(3)主程序导入上层目录中模块或其他目录(平级)下的模块
如下面程序结构:
`-- src
|-- mod1.py
|-- mod2
| `-- mod2.py
|-- sub
| `-- test2.py
`-- test1.py
若在程序test2.py中导入模块mod1和mod2。首先需要在mod2下建立__init__.py文件(同(2)),src下不必建立该文件。然后调用方式如下:
下面程序执行方式均在程序文件所在目录下执行,如test2.py是在cd sub;之后执行python test2.py
而test1.py是在cd src;之后执行python test1.py; 不保证在src目录下执行python sub/test2.py成功。
import sys
sys.path.append("..")
import mod1
import mod2.mod2