模块化,模块化指将一个完整的程序分解为一个一个小的模块。通过将模块组合,来搭建出一个完整的程序
API(Application Programming Interface 应用程序编程接口)是用于描述模块中提供的函数和类的功能和使用方式。(描述类和函数的功能及使用方式)
模块化编程中,首先设计的就是模块的 API(即要实现的功能描述),然后开始编 码实现 API 中描述的功能。最后,在其他模块中导入本模块进行调用。
我们可以通过help(模块名)查看模块的API。一般使用时先导入模块 然后通过help查看。
也可以在 python 的 api 文档中查询。首先进入 python 的安装目录下的 docs 子目录;双击打开 chm 文档,即可通过索引输入“math”查询到对应的 API 内容。
我们可以通过__doc__可以获得模块的文档字符串的内容:
salary.py
"""
计算员工工资
"""
def yearSalary(monthSalary):
"""根据传入的月薪,计算出年薪
"""
pass
def daySalary(monthSalary):
"""根据传入的月薪,计算出每天的薪资
"""
pass
main.py
import salary
print(salary.__doc__)
print(salary.yearSalary.__doc__)
print(salary.daySalary.__doc__)
输出:
计算员工工资
根据传入的月薪,计算出年薪
根据传入的月薪,计算出每天的薪资
import time as test
print(test.__name__) #time
print(__name__) #__main__
举个例子 (通过__name==“main”独立处理模块.)
#coding=utf-8
#-------------src---------------
# 源代码
name = "11111 not func"
add = "http://c.biancheng.net/python"
print(name,add)
def say():
print("22222 Python!")
class CLanguage:
def __init__(self,name,add):
self.name = name
self.add = add
def say(self):
print(self.name,self.add)
#----------test-------------
# 通常情况下,为了检验模板中代码的正确性,我们往往需要为其设计一段测试代码
say()
clangs = CLanguage("C语言中文网","http://c.biancheng.net")
clangs.say()
('11111 not func', 'http://c.biancheng.net/python')
22222 Python!
('33333', 'http://c.biancheng.net')
import demo
('11111 not func', 'http://c.biancheng.net/python')
22222 Python!
('33333', 'http://c.biancheng.net')
if __name__ == '__main__':
say()
clangs = CLanguage("C语言中文网","http://c.biancheng.net")
clangs.say()
('11111 not func', 'http://c.biancheng.net/python')
22222 Python!
('33333', 'http://c.biancheng.net')
$ python test.py
('11111 not func', 'http://c.biancheng.net/python')
导入全部
import 模块名
# 导入sys整个模块
import sys
# 使用sys模块名作为前缀来访问模块中的成员
print(sys.argv[0])
C:\Users\mengma\Desktop\hello.py
import 模块名 as 模块别名
# 导入sys整个模块,并指定别名为s
import sys as s
# 使用s模块别名作为前缀来访问模块中的成员
print(s.argv[0])
C:\Users\mengma\Desktop\hello.py
import 模块 1,模块 2…
# 导入sys、os两个模块
import sys,os
# 使用模块名作为前缀来访问模块中的成员
print(sys.argv[0])
# os模块的sep变量代表平台上的路径分隔符
print(os.sep)
C:\Users\mengma\Desktop\hello.py
\
import 模块 1 as 模块别名1,模块 2 as 模块别名2…
# 导入sys、os两个模块,并为sys指定别名s,为os指定别名o
import sys as s,os as o
# 使用模块别名作为前缀来访问模块中的成员
print(s.argv[0])
print(o.sep)
也可以只引入模块中的部分内容
from 模块名 import 成员名
# 导入sys模块的argv成员
from sys import argv
# 使用导入成员的语法,直接使用成员名访问
print(argv[0])
C:\Users\mengma\Desktop\hello.py
from 模块名 import 成员名 as 别名
# 导入sys模块的argv成员,并为其指定别名v
from sys import argv as v
# 使用导入成员(并指定别名)的语法,直接使用成员的别名访问
print(v[0])
C:\Users\mengma\Desktop\hello.py
from 模块名 import 成员名1, 成员名2
# 导入sys模块的argv,winver成员
from sys import argv, winver
# 使用导入成员的语法,直接使用成员名访问
print(argv[0])
print(winver)
C:\Users\mengma\Desktop\hello.py
3.6
from 模块 import 成员 1 as 成员别名1,成员2 as 成员别名2…
# 导入sys模块的argv,winver成员,并为其指定别名v、wv
from sys import argv as v, winver as wv
# 使用导入成员(并指定别名)的语法,直接使用成员的别名访问
print(v[0])
print(wv)
C:\Users\mengma\Desktop\hello.py
3.6
from m import *
# 引入到模块中所有内容,一般不会使用
在其它文件中用 import(或 from…import) 语句引入该文件时,Python 解释器同时如下错误:
ModuleNotFoundError: No module named ‘模块名’
意思是 Python 找不到这个模块名,这是什么原因导致的呢?
通常情况下,当使用 import 语句导入模块后,Python 会按照以下顺序查找指定的模块文件:
以上所有涉及到的目录,都保存在标准模块 sys 的 sys.path 变量中,通过此变量我们可以看到指定程序文件支持查找的所有目录。换句话说,如果要导入的模块没有存储在 sys.path 显示的目录中,那么导入该模块并运行程序时,Python 解释器就会抛出 ModuleNotFoundError(未找到模块)异常。
解决“Python找不到指定模块”的方法有 3 种,分别是:
举个例子
创建hello.py和say.py,分别放到不同目录下:
#hello.py
def say ():
print("Hello,World!")
#say.py
import hello
hello.say()
显然,hello.py 文件和 say.py 文件并不在同一目录,此时运行 say.py 文件,其运行结果为:
Traceback (most recent call last):
File "C:\Users\mengma\Desktop\say.py", line 1, in <module>
import hello
ModuleNotFoundError: No module named 'hello'
怎么解决
(1) 导入模块方式一:临时添加模块完整路径
import sys
sys.path.append('D:\\python_module')
(2) 导入模块方式二:将模块保存到指定位置
所以,我们可以直接将我们已编写好的 hello.py 文件添加到 lib\site-packages 路径下,就相当于为 Python 扩展了一个 hello 模块,这样任何 Python 程序都可使用该模块。
移动工作完成之后,再次运行 say.py 文件,可以看到成功运行的结果:
Hello,World!
(3) 导入模块方式三:设置环境变量
(3.2) 在 Linux 上设置环境变量
ls - a
#设置PYTHON PATH 环境变量
PYTHONPATH=.:/home/mengma/python_module
#导出PYTHONPATH 环境变量
export PYTHONPATH
source.bash_profile
(3.3) 在Mac OS X 上设置环境变量
ls -a
#设置PYTHON PATH 环境变盘
PYTHONPATH=.:/Users/mengma/python_module
#导出PYTHON PATH 环境变量
export PYTHONPATH
source .bash_profile
import可以在程序的任意位置调用,但是一般情况下,import语句都会统一写在程序的开头
import math
print(id(math))
print(type(math))
print(math.pi) #通过math.成员名来访问模块中的成员
输出:
2065342821784
<class 'module'>
3.141592653589793
s = 'math'
m = __import__(s)
print(m.pi)
输出:
3.141592653589793
为啥需要__import__()
>>>import demo text
SyntaxError: invalid syntax
>>> import 1demo
SyntaxError: invalid syntax
此时,可以使用Python 提供的 import() 内置函数引入模块
__import__("demo text")
__import__("1demo")
注意
import importlib
a = importlib.import_module('math')
print(a.pi)
输出:
3.141592653589793
事实上,当我们向文件导入某个模块时,导入的是该模块中那些名称不以下划线(单下划线“_”或者双下划线“__”)开头的变量、函数和类。因此,如果我们不想模块文件中的某个成员被引入到其它文件中使用,可以在其名称前添加下划线。
举个例子:
#demo.py
def say():
print("人生苦短,我学Python!")
def CLanguage():
print("C语言中文网:http://c.biancheng.net")
def disPython():
print("Python教程:http://c.biancheng.net/python")
#test.py
from demo import *
say()
CLanguage()
disPython()
人生苦短,我学Python!
C语言中文网:http://c.biancheng.net
Python教程:http://c.biancheng.net/python
人生苦短,我学Python!
C语言中文网:http://c.biancheng.net
Traceback (most recent call last):
File "C:/Users/mengma/Desktop/2.py", line 4, in <module>
disPython()
NameError: name 'disPython' is not defined
除此之外,还可以借助模块提供的 __all__
变量,该变量的值是一个列表,存储的是当前模块中一些成员(变量、函数或者类)的名称。通过在模块文件中设置 __all__
变量,当其它文件以“from 模块名 import *
”的形式导入该模块时,该文件中只能使用 __all__
列表中指定的成员
__all__
变量时,只能导入该变量指定的成员,未指定的成员是无法导入的。举个例子:
def say():
print("人生苦短,我学Python!")
def CLanguage():
print("C语言中文网:http://c.biancheng.net")
def disPython():
print("Python教程:http://c.biancheng.net/python")
__all__ = ["say","CLanguage"]
__all__
变量只包含 say() 和 CLanguage() 的函数名,不包含 disPython() 函数的名称。此时直接执行 test.py 文件,其执行结果为:人生苦短,我学Python!
C语言中文网:http://c.biancheng.net
Traceback (most recent call last):
File "C:/Users/mengma/Desktop/2.py", line 4, in <module>
disPython()
NameError: name 'disPython' is not defined
__all__
变量仅限于在其它文件中以“from 模块名 import *”的方式引入。也就是说,如果使用以下 2 种方式引入模块,则 __all__
变量的设置是无效的。
__all__
变量即便设置,也形同虚设。import math
print(id(math))
import math as m
print(id(m))
输出:
2250728961432
2250728961432
import 加载的模块分为四个通用类别: