Python 学习#10 模块

本章将讲解python的模块导入机制,常用的导入方式,理解目录结构和包结构的关系,_init_.py的用法以及一些常见的python包管理工具的介绍。

模块

模块支持从逻辑上组织python 代码。当代码量变得相当大的时候,我们最好把代码分成一些有组织的代码段,前提是保证他们的彼此交互。python允许调入(import)一个模块(module),从而实现代码重用。

模块和文件

模块的导入需要一个叫做“路径搜索”的过程,即在文件系统“预定义区域”中查找.py文件。这些预定义区域是你的python搜索路径的集合。路径搜索和搜索路径是两个不同的概念,前者是查找某个文件的操作,后者是去查找一组目录。通过调用sys模块中的path可以查到搜索路径。
调用sys.module可以找到当前导入了哪些模块,和他们的位置。

名称空间

名称空间是名称标识符到对象的映射。在此前章节已经讨论过名称空间,包括局部名称空间、全局名称空间以及内建名称空间。
访问一个属性时,解释器会从按照:局部、全局、内建名称空间的顺序进行搜索。

导入模块

  • 使用import语句导入模块。
    • import sys
  • 使用from…import…导入指定的模块属性。
    • from module import name1
  • 使用import…as…重命名导入的模块。
    • import Tkinter as tk

导入也可以多行同时导入。

模块内建函数

  • _import_():实际导入模块的函数,import语句将会调用此函数完成导入工作。
  • globals():返回调用者全局名称空间的字典。
  • locals():返回调用者局部名称空间的字典。
  • reload(module):重新导入一个已经导入的模块

包是一个有层次的文件目录结构,它定义了一个由模块和子包组成的python应用程序执行环境。包用来解决如下的问题:

  • 为平坦的 名称空间加入了有层次的组织结构。
  • 允许程序员把有联系的模块组合到一起。
  • 允许分发者使用目录结构而不是一堆混乱的文件。
  • 帮助解决有冲突的模块名称。

目录结构

包的例子:

Phone/
	_init_.py
	common.py
	Voicedta/
		_init_.py
		Post.py
	Fax/
		_init_.py
		G3.py
	Mobile/
		_init_.py
		Analog.py

Phone是最顶层的包,而voicedta等是它的子包。
可以通过如下的方式导入子包: import Phone.Mobile.Analog
也可以使用from…import来导入不同需求。

在上边的目录结构中可以发现有很多_init_.py文件,这些是初始化模块,from…import语句导入子包是需要用到。

绝对导入和相对导入

包的使用越来越广泛,很多时候导入子包会导致和真正的标准库发生名字冲突。包模块会把名字相同的标准库模块隐藏掉,因为它首先在包内执行相对导入,隐藏掉标准模块。

为此,所有导入现在都被认为是绝对的,也就是说这些名字必须通过python路径来访问(sys.path)。

绝对倒入特性限制了模块作者的一些特权,失去了import语句的自由。相对倒入特性稍微的改变了import语法,让导入者知道在子包的哪里能找到某个模块。

自动载入的模块

当python解释器在标准模式下启动,一些模块会被解释器自动导入,用于系统相关操作。通过sys.modules可以查看当前被载入到解释器的模块。

如果不想某个属性被导入,可以通过在属性名称前加上下划线(_)来隐藏。

python中的包处理工具

pip,后续会补充完。
在国内pip的使用可能会出现一些问题,如果出现ssl相关错误,可以使用:pip install xx -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
将xx替换为需要安装的包就可以了
python基础学习本章结束,下一章开始讨论第一个高级应用多线程处理。

你可能感兴趣的:(Python)