模块

模块是python中的最高组织单元,在物理层面上,模块以文件存储,模块的文件名就是模块的名字.py,每个模块都有自己的名称空间。

python按照路径搜索来查找模块文件,在PYTHONPATH环境变量中的路径为Python模块的搜索路径,通过sys.path属性可以看到模块搜索路径的列表,python按照这个列表的顺序对模块进行搜索,所以在路径列表前面的路径搜索到模块之后就不会继续搜索。由于该值是一个列表,可以通过sys.path.append方法,或者sys.path.insert方法添加路径到该列表中,或者通过sys.path.pop方法将某些路径排除到搜索路径之外等等。

模块的物理层面是文件,包就是有层次的特殊文件结构,特殊的点在于,每个目录下面都必须有__init__.py文件,如果没有该文件,则只是一个普通的文件目录,并不能作为包导入。这是因为导入包的原理其实就是导入该包的路径下面的__init__.py,其中包含可以导入的各种模块。

模块导入和加载

通过import、from   import语句导入一个模块,或者通过as给模块起别名,模块只有在第一次导入的时候才会被加载,模块加载时,其实就是执行模块中的所有语句,此时,如果模块中除了定义的类和方法之外,在顶级作用域下有代码时,这些代码会被执行,所以在模块编写中需要避免在顶级作用域下直接执行代码。

在模块第一次被导入时,往往会比较慢,这是因为python在导入一个新的模块时,会从模块所在目录检查是否有.pyc文件,如果没有该文件,则会将模块编译成字节码,从而提高下一次导入的效率。

python也可以从一个ZIP文件中导入模块,该ZIP文件会被看成一个包,然而python不会再生成.pyc文件到该ZIP文件中,所以导入效率相对较低一些。

名称空间

名称空间指标示符到对象的映射,python在执行过程中,有两个或者三个活动的名称空间:局部名称空间、全局名称空间、内建名称空间。内建名称空间的所有名字都包含在__builtins__模块中,该模块又包含__buitin__模块,该模块中包含内建函数、异常以及其他属性,每一个python程序执行之前都会先导入__builtins__模块,每个模块都有自己的名称空间,导入一个模块时,会加载执行模块的全局名称空间,这也是为什么在加载一个模块时,所有顶级作用域下的代码会直接执行。

名称空间和作用域的关系:所有局部名称空间的名称都在局部作用范围内,局部名称空间之外的所有名称都在全局作用范围内。局部名称空间和作用域会随着函数的调用而不断变化,但是全局名称空间是不变的。名称空间决定一个变量名字是否存在,而作用域决定一个变量名字是否可以被访问到。通过globals()、locals()内建函数可以判断出某一名字属于哪个名称空间。在访问一个属性的时候,会从局部名称空间、全局名称空间、内建名称空间中寻找该名字,如果都找不到则会返回一个NameError的错误,由于寻找时总是先去寻找局部名称空间,所以局部名称空间中如果有和全局名称空间中的变量重名,则会讲全局名称空间中的变量“覆盖”(其实是不会再被找到)。

内建函数

__import__()函数,实际上import语句调用的就是__import__()函数来完成工作,通过重写该函数,可以自定义导入算法,也可以使用md=__import__(‘module’) ,相当于 import module as ad。

globals()、locals() 返回全局名称空间和局部名称空间的字典,其键为名称空间中的名字。

reload()函数可以从新加载一个模块,顾名思义,会讲模块从新执行一次。

Python学习_09_模块的更多相关文章

  1. Python学习--Selenium模块

    1. Python学习--Selenium模块介绍(1) 2.Python学习--Selenium模块学习(2) 其他: 1. Python学习--打码平台

  2. Python学习--Selenium模块学习(2)

    Selenium的基本操作 获取浏览器驱动寻找方式 1. 通过手动指定浏览器驱动路径2. 通过 `$PATH`环境变量找寻浏览器驱动 可参考Python学习--Selenium模块简单介绍(1) 控制 ...

  3. Python学习---重点模块的学习【all】

    time     [时间模块] import time # print(help(time)) # time模块的帮助 print(time.time()) # 时间戳 print(time.cloc ...

  4. Python学习之模块进程函数详解

    今天在看<Beginning Linux Programming>中的进程相关部分,讲到Linux几个进程相关的系统函数: system , exec , fork ,wait . Pyt ...

  5. python学习——常用模块

    在学习常用模块时我们应该知道模块和包是什么,关于模块和包会单独写一篇随笔,下面先来了解有关在python中的几个常用模块. 一.什么是模块 常见的场景:一个模块就是一个包含了python定义和声明的文 ...

  6. Python学习之模块基础

    模块就是程序 编写以下简单代码 print('hello python') 并将py文件保存在c盘的python(假设新建)文件下,通过pycharm的Terminal 或者windom命令窗口调出p ...

  7. python学习之模块导入,操作邮件,redis

    python基础学习06 模块导入 导入模块的顺序 1.先从当前目录下找 2.当前目录下找不到,再从环境变量中找,如果在同时在当前目录和环境变量中建立相同的py文件,优先使用当前目录下的 导入模块的实 ...

  8. Python学习——struct模块的pack、unpack示例

    he struct module includes functions for converting between strings of bytes and native Python data t ...

  9. python学习day15 模块(重点)

    模块(重点) python2,与py3的区别 py2:range() 在内存中立即把所有的值都创建,xrange() 不会再内存中立即创建,而是在循环时边环边创建. py3:range() 不会再内存 ...

随机推荐

  1. HDU3790-最短路径问题

    最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  2. PhpStorm连接服务器,开始自动上传功能

    连接服务器 菜单栏找到[工具/Tools]->[Deployment/部署]->[Confinguration-/配置-]. 点加号(+),添加一台服务器,填写名称,选择类型为SFTP,点 ...

  3. Sagit.Framework For IOS 开发框架入门开发教程1:框架下载与环境配置

    背景: 前天开源了框架:开源:Sagit.Framework For IOS 开发框架 所以注定要追补一套开发教程了,所以尽量抽空了!!! 步骤 1:下载框架源码 GitHub:https://git ...

  4. “use strict” 严格模式使用(前端基础系列)

    ECMAscript5添加一种严格模式的运行模式("use strict"),让你的js语句在更加严格的环境下进行运行: 一.主要作用: 消除版本javascript中一些不合理及 ...

  5. JS对象属性命名规则

    JS标识符的命名规则,即变量的命名规则: 标识符只能由字母.数字.下划线和'$'组成 数字不可以作为标识符的首字符 对象属性的命名规则 通过[]操作符为对象添加属性时,属性名称可以是任何字符串(包括只 ...

  6. svn服务器的搭建与使用二

    转载出处 上一篇介绍了VisualSVN Server和TortoiseSVN的下载,安装,汉化.这篇介绍一下如何使用VisualSVN Server建立版本库,以及TortoiseSVN的使用. 首 ...

  7. Libcurl的编译_HTTP/HTTPSclient源代码演示样例

    HTTP/HTTPSclient源代码演示样例 环境:  zlib-1.2.8  openssl-1.0.1g  curl-7.36 Author:  Kagula LastUpdateDate: 2 ...

  8. android手机状态解释,比方android.os.Build.VERSION.SDK

    //BOARD 主板 String phoneInfo = "BOARD: " + android.os.Build.BOARD; phoneInfo += ", BOO ...

  9. Zend_Json 简介 --(手冊)

    1.  简单介绍 Zend_Json 提供一个方便的方式来串联(native的)PHP(的变量)和JSON,并将JSON(对象)解码到PHP中. 2.  基本使用方法 Zend_Json的使用包含使用 ...

  10. zookeeper web ui--&gt;node-zk-browser安装

    眼下公司正在使用zookeeper做配置管理和其它工作,在网上找几个zookeeper管理工具,都不尽人意,要么功能不够强大,要么不能友好的浏览zk树形结构.我的想法是zk管理工具,应该有一个树形结构 ...