Python学习笔记12:Python模块

1、模块
自我包含且有组织的代码片段就是模块(module)。
模块在逻辑上组织Python代码。文件是物理层上组织模块的方法。
导入模块或模块属性实现代码重用。
模块组织Python代码,组织模块。

2、模块和文件
(1)模块名称空间
名称空间:一个名称空间就是一个从名称到对象的关系映射集合。
每个模块都定义了它自己的唯一的名称空间,所以可以防止同名冲突的发生。
(2)搜索路径和路径搜索
路径搜索:在文件系统“预定义区域”中查找模块文件。
搜索路径:预定义区域。默认搜索路径是在编译或是安装时指定的。默认搜索路径是在编译或是安装时指定的。
修改默认搜索路径的方式:

  • 在启动解释器或执行脚本前设置或修改PYTHONPATH环境变量。
  • 修改sys.path返回的列表。

使用sys.modules可以找到当前导入了哪些模块和它们来自什么地方。
sys.modules返回一个字典,sys.path返回一个列表。

3、名称空间
名称空间是名称(标识符)到对象的映射。向名称空间添加名称的操作过程涉及绑定标识符到指定对象的操作(以及给该对象的引用计数加1)。改变一个名字的绑定叫做重新绑定,删除一个名字叫做解除绑定
Python解释器先加载内建名称空间。由__builts__模块中的名称构成。接着加载执行模块的全局名称空间,会在模块开始执行后变为活动名称空间。若调用函数,则有第三个名称空间(局部名称空间)。
globals()locals()内建函数判断某一名字数哪个名称空间。__builts__模块包含内建名称空间中内建名字的集合,其中大多数来自__built__模块;__built__模块包含内建函数,异常及其他属性。

4、导入模块
(1)import语句

import module
...
import moduleN

也可以在一行内导入多个模块

import module1 [,module2 [,...]]

import语句的模块顺序(在Python模块头部导入所有模块):

  • Python标准库模块
  • Python第三方模块
  • 应用程序自定义模块

模块在顶层被导入,作用域是全局的;在函数中导入,作用域是局部的。
如果模块是被第一次导入,它将被加载并执行。加载模块会导致这个模块被“执行”。
(2)from-import语句
可以导入模块里指定的模块属性。

from module import name1[,name2[,...,nameN]]

from-import导入过多属性时,会自动换行,且需要使用“\”

from Tkinter import Tk,Frame,Button,Entry,\
         Text,LEFT

可以使用多行导入的from-import语句(2.4):

from Tkinter import Tk,Frame,Button,Entry
from Tkinter import Text,LEFT

使用自己想要的名字替换模块的原始名字(2.0)

import Tkinter as tk

5、模块导入的特性
(1)载入时执行模块
加载模块时,被导入模块的顶层代码将直接被执行,这包括设定全局变量以及类和函数的声明,如果有检查__name__的操作,那么它也会被执行。(只把函数和模块的定义放入模块的顶层是良好的模块编程习惯)
(2)导入和加载(load)
一个模块只被加载一次,无论导入多少次。
(3)导入到当前名称空间的名称
用from-import可以把名字导入到当前的名称空间,不需要使用属性/句点属性标识来访问模块的标识符。

from module import var
from module import *(不提倡)

(4)被导入到导入者作用域的名字
只从模块导入名字存在一个副作用:那些导入的名字会成为局部名称空间的一部分,这可能覆盖一个已经存在的具有相同名字的对象。而且对这些变量的改变只影响它的局部拷贝而不是所导入模块的原始名称空间。
(5)”导入”新的特性

from __future__ import new_future 

(6)警告框架
警告框架用来警告用户不要使用一个即将改变或不支持的操作,警告框架包含几部分:

  • API:调用API发布警告,使用warnings模块。
  • 一些警告异常类的集合:Warning,UserWarning,DeprecationWarning,SyntaxWarning和RunningWarning等。
  • 警告过滤器:不仅仅收集关于警告的信息(如行号、警告原因等),而且还控制是否忽略警告,是否显示警告(可以是自定义的格式),或者转换为错误生成一个异常等。

(7)从zip文件中导入模块(2.3)
(8)“新的”导入钩子(2.3)
实现自定义导入器的老方法:使用“钩子”自定义导入器或覆盖__import__()。
2.3引入”新的”导入钩子,包含两个类:一个查找器,一个载入器。这两个类接受一个参数:模块或包的全名称。查找器负责查找模块,找到返回一个载入器对象,载入器会把模块载入到内存,它负责完成创建一个Python模块所需要的一切操作,然后返回模块。

6、模块的内建函数
(1)__import__()(1.5)
import语句调用该函数完成导入模块的工作。可以覆盖该方法实现自定义的导入。

__import__(module_name[,globals[,locals[,fromlist]]])
  • module_name:要导入的模块的名称
  • globals:包含当前全局符号表的名字的字典,默认使用globals()
  • locals:包含局部符号表的名字的字典, 默认使用locals()
  • fromlist:一个使用from-import语句所导入符号的列表, 默认为[]

(2)globals()和locals()
分别返回调用者全局和局部名称空间的字典。
(3)reload()
重新导入一个已经导入的模块。
使用reload()函数时,模块必须是全部导入(不是使用from-import),而且它必须被成功导入,另外,reload()函数的参数必须是模块自身而不是包含模块名的字符串。

7、包(1.5)
包是一个有层次的文件目录结构。
使用from和from-import导入包中的模块。
目录结构中存在的__init__.py文件是初始化模块,from-import语句导入子包时需要用到它。包目录没有添加__init__.py文件会导致一个ImportWarning信息(2.5)。
from package.module import *导入哪些文件在__init__.py文件中加入的__all__变量来定义,由一个模块名字符串列表组成。
绝对导入/相对导入
从Python2.7开始,绝对导入特性将成为默认功能。
因为import语句总是绝对导入的,所以相对导入只应用于from-import语句。
绝对导入:from Phone.Mobile.Analog import dial
相对导入:from .Analog import dial(相对导入语法的第一部分是一个句点,指示一个相对的导入操作。)

8、模块的其他特性
(1)自动载入的模块,使用sys.modules查看
(2)阻止属性导入,给不想导入的属性名称加上一个下划线(_)

import foo._bar

(3)不区分大小的导入,必须指定一个叫做PYTHONCASEOK的环境变量。
(4)源代码编码(2.3)

#! /usr/bin/env python
# -*- coding:UTF-8 -*-

(5)导入循环(循环引用)
(6)模块执行
通过命令行或shell.execfile()、模块导入、解释器的-m选项等执行一个Python模块。

9、相关模块

  • imp 提供了一些底层的导入者功能。
  • modulefinder 查找Python脚本所使用的所有模块。
  • pkgutil 提供多种将Python包打包为一个“包”文件分发的方法。
  • site 和*.pth文件配合使用,指定包加入Python路径的顺序。
  • zipimport 该模块用于导入zip归档文件中的模块。
  • distutils 对建立、安装、分发Python模块和包进行支持。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值