模块化编程
导入python package的几种方式
import …
即导入一个py文件,一个.py文件视为一个module ;是个相对路径
使用: 模块名.函数名
比如import math就是导入math.py, math.py中有很多函数def。使用的时候就用math.函数名,比如a = math.sqrt(b);相当于引入的模块是一个对象,调用这个模块对象下的方法;
from … import *
导入一个模块中所有函数
使用时直接用函数名就行了,不需要用模块名.函数名;使用**from math import sqrt a = sqrt(b) **
from … import …
导入模块中的某个函数;
使用**from math import sqrt a = sqrt(b) **
写自己的python模块
Package 和 Module
正如廖雪峰老师提到相同名字的函数和变量名放在不同模块中不会起冲突,但是如果不同人写的模块名相同,就会引起冲突,因此我们可以用**包(Package)**来组织模块(Module)
现在,假设我们的abc
和xyz
这两个模块名字与其他模块冲突了,于是我们可以通过包来组织模块,避免冲突。方法是选择一个顶层包名,比如mycompany
,按照如下目录存放:
mycompany
├─ __init__.py
├─ abc.py
└─ xyz.py
引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。现在,abc.py
模块的名字就变成了mycompany.abc
,类似的,xyz.py
的模块名变成了mycompany.xyz
。
请注意,每一个包目录下面都会有一个__init__.py的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。__init__.py
可以是空文件,也可以有Python代码,因为__init__.py
本身就是一个模块,而它的模块名就是mycompany
。
类似的,可以有多级目录,组成多级层次的包结构。比如如下的目录结构:
mycompany
├─ web
│ ├─ __init__.py
│ ├─ utils.py
│ └─ www.py
├─ __init__.py
├─ abc.py
└─ utils.py
文件www.py
的模块名是mycompany.web.www
,两个utils.py
的模块名分别是mycompany.utils
和mycompany.web.utils
,mycompany
这个模块对应的.py
文件是mycompany/__init__.py
; mycompany.web
这个模块对应的是web
下面的__init__.py
导入自己的模块
import hello
import ooo # error: no module named ooo
import aaa # error: no module named aaa
from pack_package import ooo
from pack_directory import aaa
import pack_package # aka import pack_package/__init__.py
import pack_directory # not a error, but it's only a directory, not a module
不管是package还是directory还是.py , 只要在同级目录下,可直接import
如果不能import,原因在于path下不包括from的文件夹或import的文件
import sys
print(sys.path) # 查看有哪些pat
如果import的模块不在path下,使用sys
import sys
sys.path.append("E:\\5my_example\\pycharm")
import he # he.py位于E:\\5my_example\\pycharm下,所以前两行代码得先写
**自己写的module里面也可以import **
上一篇: 2、CSS 文本