对于一个真正的 Python 程序,我们不可能自己完成所有的工作,通常需要借助第三方库。另外,也不可能将整个程序的源代码写在一个源文件中,这就需要以模块化的方式组织项目的源代码。
使用import的语法来导入模块,其实import还有更详细的用法,主要有以下两种:
import 模块名1 [as 别名1], 模块名2 [as 别名2],…: 导入整个模块。
from 模块名 import 成员名1 [as 别名1],成员名2 [as 别名2],…: 导入模块中指定成员。
上面两种 import 语句的区别主要有以下几点:
第一种import语句导入整个模块的所有成员(包括变量、函数、类等);第二种导入语句只导入模块内的指定成员(除非使用模块名导入*的形式,但一般不推荐这种语法)。
使用第一种导入语句导入模块中的成员时,必须加上模块名或模块别名前缀;使用第二种导入语句导入模块中的成员时,不需要使用任何前缀,只需使用成员名称或成员别名即可。
下面程序使用导入整个模块的最简单语法来导入指定模块:
# 导入sys整个模块
import sys
# 使用sys模块名作为前缀来访问模块中的成员
print(sys.argv[0])
上面第二行代码以最简单的方式导入了sys模块,所以在程序中使用sys模块中的成员时,必须加上模块名作为前缀。
运行上面的程序,可以看到如下输出(sys模块下的argv变量用于获取运行Python程序的命令行参数,argv[0]用于获取Python程序的程序名) .
import test.py
在导入整个模块时可以为模块指定别名。例如如下程序:
# 导入sys整个模块,并指定别名为s
import sys as s
# 使用s模块别名作为前缀来访问模块中的成员
print(s.argv[0])
第二行代码指定了导入sys模块时的别名s,所以在程序中使用sys模块中的成员时,必须加上模块别名s作为前缀。运行程序,可以看到如下输出:
import test2.py
使用导入整个模块的语法也可一次导入多个模块,多个模块之间用逗号隔开。例如如下程序:
# 导入sys、os两个模块
import sys,os
# 使用模块名作为前缀来访问模块中的成员
print(sys.argv[0])
# os模块的sep变量代表平台上的路径分隔符
print(os.sep)
上面第二行代码一次性导入了sys和os这两个模块,所以程序需要使用sys和os这两个模块的成员,只要以sys和os的模块名作为前缀即可。在Windows平台运行程序,可以看到如下输出(os模块的sep变量代表平台上的路径分隔符):
import test3.py
\
同时,在导入多个模块时也可以为模块指定别名,例如如下程序:
# 导入sys、os两个模块,并为sys指定别名s,为os指定别名o
import sys as s,os as o
# 使用模块别名作为前缀来访问模块中的成员
print(s.argv[0])
print(o.sep)
上面第二行代码一次性导入了sys和os这两个模块,并分别给它们取了别名s和o,这样程序就可以通过s和o这两个前缀来使用sys和os这两个模块的成员了。在Windows平台运行程序,可以看到如下输出:
import_test4 .py
\
接下来介绍使用 from...import 导入模块内指定成员的用法。下面程序使用 from...import 导入模块成员的最简单语法来导入指定成员:
# 导入sys模块的argv成员
from sys import argv
# 使用导入成员的语法,直接使用成员名访问
print(argv[0])
第二行代码引入了sys模块中的argv成员,这样程序中就可以直接使用argv成员,不需要任何前缀。运行程序,可以看到如下输出:
from import test.py
在使用 from...import 导入模块成员时,还可以为成员指定别名,比如下面的程序:
# 导入sys模块的argv成员,并为其指定别名v
from sys import argv as v
# 使用导入成员(并指定别名)的语法,直接使用成员的别名访问
print(v[0])
第 2 行代码导入了 sys 模块中的 argv 成员,并为该成员指定别名 v,这样即可在程序中通过别名 v 使用 argv 成员,无须使用任何前缀。运行该程序,可以看到如下输出结果:
from import test2.py
使用form...import导入模块成员时,也可以同时导入多个成员,比如下面的程序:
# 导入sys模块的argv,winver成员
from sys import argv, winver
# 使用导入成员的语法,直接使用成员名访问
print(argv[0])
print(winver)
上面第 2 行代码导入了 sys 模块中的 argv、 winver 成员,这样即可在程序中直接使用 argv、winver 两个成员,无须使用任何前缀。运行该程序,可以看到如下输出结果(sys 的 winver 成员记录了该 Python 的版本号):
from import test3.py
3.6
在使用 from...import 同时导入多个模块成员时也可指定别名,同样使用 as 关键字为成员指定别名,例如如下程序:
# 导入sys模块的argv,winver成员,并为其指定别名v、wv
from sys import argv as v, winver as wv
# 使用导入成员(并指定别名)的语法,直接使用成员的别名访问
print(v[0])
print(wv)
上面第二行代码在sys模块中导入了argv和winver成员,并分别给他们分配了别名v和wv,这样argv和winver成员就可以通过v和wv这两个别名不加任何前缀在程序中使用了。
在使用 from...import 语法时也可一次导入指定模块内的所有成员,例如如下程序:
#导入sys 棋块内的所有成员
from sys import *
#使用导入成员的语法,直接使用成员的别名访问
print(argv[0])
print(winver)
上面的代码一次性导入了sys模块中的所有成员,这样程序就可以通过成员名来使用模块中的所有成员了。这个程序的输出与前面程序的输出完全一样。
需要注意的是,一般不推荐使用“from module import”语法来导入指定模块中的所有成员,因为它存在潜在的风险。比如同时导入module1和module2的所有成员,如果两个模块中都有foo()函数,那么当程序中执行如下代码时:
foo()
上面的foo()函数是在module1还是module2中调用的?因此,这种在指定模块内导入所有成员的用法是有风险的。
但如果换成如下两种导入方式:
import module1
import module2 as m2
接下来要分别调用这两个模块中的 foo() 函数就非常清晰。程序可使用如下代码:
#使用模块module1 的模块名作为前缀调用foo()函数
module1.foo()
#使用module2 的模块别名作为前缀调用foo()函数
m2.foo()
或者使用 from...import 语句也是可以的:
#导入module1 中的foo 成员,并指定其别名为foo1
from module1 import foo as fool
#导入module2 中的foo 成员,并指定其别名为foo2
from module2 import foo as foo2
这时候module1和module2中的foo函数通过别名就很好区分了,分别调用两个模块中的foo()函数就很清楚了:
foo1() #调用module1 中的foo()函数
foo2() #调用module2 中的foo()函数
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ Python的字符编码介绍12/05
- ♥ Python 中 __new__() 方法的使用12/13
- ♥ 如何在python中表达路径?11/21
- ♥ 如何用python开发应用程序08/28
- ♥ python可以做网站吗12/16
- ♥ 如何在python中将字符串转换为int11/16
内容反馈