导入模块
import语句
import module1 import module2 . . import moduleN #也可以在一行导入多个模块: import module1,module2...moduleN #但是这样的代码可读性不如多行的导入语句。而且在性能上与上面没有什么不同,推荐使用上面的格式
推荐所有的模块导入都在代码的开头部分进行,而且最好按照这样的顺序:
- Python标准库模块
- Python第三方模块
- 应用程序自定义模块
from-import语句
可以导入指定的模块属性,也就是把指定名称导入到当前作用域:
from module import name1,name2...nameN
扩展的import语句(as)
有时候导入的模块或模块属性名称已经在你的程序中使用了,或者你不想使用导入的名字,可以使用as关键字对模块或变量进行重命名:
import time as tm #time.time() 原方法 #tm.timg() 重命名后使用方法 from time import sleep as sp #sleep() 原方法 #sp() 重命名后使用方法
模块导入的特性
载入时执行模块
加载模块会导致这个模块被“执行”。也就是被导入模块的顶层代码将直接被执行。通常这包括全局变量及类和函数的声明。如果有检查__name__的操作,那么它也会被执行。
导入(import)和加载(load)
一个模块只被加载一次,无论它被导入多少次。这可以阻止多重导入时代码被多次执行。例如你的导入了sys模块,而你要导入的其他5个模块也导入了它,那么每次都加载sys不是明智之举!所以,加载只在第一次导入时发生。
导入到当前名称空间的名称
调用from-import可以把名字导入挡墙的名称空间里去,这意味着你不需要使用属性/句点属性标识来访问模块的标识符。例如,你需要访问模块module中的var名字时这样被导入的:
from module import var #我们使用单个的var就可以访问它自身。把var导入到名称空间后就再没必要引用模块了。 #也可以把指定模块的所有名称都导入到当前名称空间 from module import * #在实际工作中应限制使用 from module import * ,因为它会“污染”当前名字空间,而且很可能覆盖当前名称空间中现有的名字。
包
包是一个有层次的文件目录结构,它定义了一个由模块和子包组成的Python应用程序执行环境。
- 为平坦的名称空间加入有层次的组织架构;
- 允许程序员把有联系的模块组合到一起;
- 允许分发者使用目录结构而不是一大堆混乱的文件;
- 帮助解决有冲突的模块名称。
与类和模块相同,包也使用句点属性标识来访问他们的元素。使用标准的import和from-import语句导入包中的模块。
目录结构
Phone/ #Phone是最顶层的包 __init__.py common_utll.py Voiccedta/ #是Phone的子包 __init__.py pots.py Isdn.py Fax/ __init__.py G3.py Mobile/ __init__.py Analog.py Digital.py Pager/ __init__.py Numeric.py #我们可以这样导入子包: import Phone.Mobile.Analog Phone.Mobile.Analog.dial()
#也可以使用from-import实现不同需求的导入。 from Phone import Mobile #只导入顶层的子包,然后使用属性/点操作符向下引用子包树 Mobile.Analog.dial() from Phone.Mobile import Analog #引用更多的子包 Analog.dial() #事实上可以一直沿子包的树状结构导入: from Phone.Mobile.Analog import dial dial()