模块

编写好的一个python文件可以有两种用途:
1)脚本,一个文件就是整个程序,用来被执行
2)模块,文件中存放着一堆功能,用来被导入使用

模块的分类

1)开发者编写的 .py文件
2 ) 由C或C++编译的共享库或DLL
3 ) 包
4 ) 内置模块

模块的查找顺序
1)内存中已经加载的模块(防止重复加载)
2 ) 内置模块(所以说自定义模块不应该和系统模块同名)
3 )sys.path路径中包含的模块

额外知识:sys.path初始化顺序
1 )执行文件所在的当前目录
2 )PTYHONPATH(包含一系列目录名,与shell变量PATH语法一样)
3 )依赖安装时默认指定的

模块的使用
使用前必知
1)不管程序走到哪个模块的哪一步,程序只认程序启动的路径文件夹。
2)重导入只会增加模块的引用
具体地说,第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载到内存中的模块对象增加了一次引用,不会重新执行模块内的语句
额外功能
1)用于测试环境的模块重导入:import importlib     importlib.reload(aa)
2 ) 为模块名起别名 import spam as sm ,这种做法常用于统一接口名一样的模块
3 ) 限制模块导入的名字
  在spam.py中新增一行,__all__=['money','read1'] #这样在另外一个文件中用from spam import *就这能导入列表中规定的两个名字

扩展知识:提高模块加载速度的.pyc文件
pyc文件(字节码文件)也可以被python解释器执行,其功能主要是提高加载模块的速度。
注意的是:从.pyc文件中读指令来执行不会比从.py文件中读指令执行更快,只有在模块被加载时,.pyc文件才是更快的

pyc文件怎样产生?
python解释器会在__pycache__目录中下缓存每个模块编译后的版本,
格式为:module.version.pyc。通常会包含python的版本号。例如,在CPython3.3版本下,spam.py模块会被缓存成__pycache__/spam.cpython-33.pyc。
这种命名规范保证了编译后的结果多版本共存。Python检查源文件的修改时间与编译的版本进行对比,如果过期就需要重新编译。这是完全自动的过程。
由于编译的模块是平台独立的,所以相同的库可以在不同的架构的系统之间共享。 使得pyc成为一种跨平台的字节码,是由python虚拟机来执行的,
但是pyc的内容跟python的版本相关,不同的版本编译后的pyc文件不同,2.5编译的pyc文件不能到3.5上执行,
并且pyc文件是可以反编译的,因而它的出现仅仅是用来提升模块的加载速度的,不是用来加密的。

注意:python解释器在以下两种情况下不检测缓存
1) 如果是在命令行中被直接导入模块,则按照这种方式,每次导入都会重新编译,并且不会存储编译后的结果
2 )  如果源文件不存在,那么缓存的结果也不会被使用,如果想在没有源文件的情况下来使用编译后的结果,则编译后的结果必须在源目录下



包就是一个包含有__init__.py文件的文件夹,所以其实我们创建包就是为了将模块组织起来。创建包的目的是为了被导入使用。
注意: 在python3中,即使包下没有__init__.py文件,import 包仍然不会报错,而在python2中,包下一定要有该文件,否则import 包报错
包的使用
使用前必知
1)导入包本质就是在导入包的包下的__init__.py, 产生的名称空间的名字同样来源于文件
2)单独导入包名称时不会导入包中所有包含的所有子模块。from glance.api import *,实际上该语句只会导入包api下__init__.py文件中定义的名字
  若想仅仅导入包,就使用包.包.模块形式,例如:import glance.db.models
  或者在__init__.py上面下功夫。

例如:
#glance/__init__.py
from . import cmd

#glance/cmd/__init__.py
from . import manage

3) from后import导入的模块,必须是明确的是被导入的右边不能带点,否则会有语法错误,如:from a import b.c是错误语法
4 )  '.','..'这些相对路径符,只能用于连接包内的模块用的,
  换句话说,存在相对模块引块只是为了被另外的模块引用而存在,永远不能当做入口。而入口处的路径必定是绝对路径

 

深入理解并使用python的模块与包的更多相关文章

  1. Python之模块和包导入

    Python之模块和包导入 模块导入: 1.创建名称空间,用来存放模块XX.py中定义的名字 2.基于创建的名称空间来执行XX.py. 3.创建名字XX.py指向该名称空间,XX.名字的操作,都是以X ...

  2. 一文搞懂 Python 的模块和包,在实战中的最佳实践

    最近公司有个项目,我需要写个小爬虫,将爬取到的数据进行统计分析.首先确定用 Python 写,其次不想用 Scrapy,因为要爬取的数据量和频率都不高,没必要上爬虫框架.于是,就自己搭了一个项目,通过 ...

  3. Python之模块和包

    一.模块 1.什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编 ...

  4. 《Python》模块和包

    一.模块 1.什么是模块: 一个模块就是一个包含了Python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1.使用Python编写的代码(. ...

  5. Python之模块和包学习

    模块简介 python是由一系列的模块组成的,每个模块就是一个py为后缀的文件,同时模块也是一个命名空间,从而避免了变量名称冲突的问题.模块我们就可以理解为lib库,如果需要使用某个模块中的函数或对象 ...

  6. python基础----模块、包

    一 模块                                                                                                 ...

  7. Python基础-模块与包

    一.如何使用模块 上篇文章已经简单介绍了模块及模块的优点,这里着重整理一下模块的使用细节. 1. import 示例文件:spam.py,文件名spam.py,模块名spam #spam.py pri ...

  8. python学习——模块和包

    在之前常用模块中我们已经初步了解了模块的导入,今天来说学习一下模块和包.我们可以把模块理解成每一个python文件.而包就是多个能解决一类问题的python文件全部放在一起.OK

  9. Python编程-模块和包

    一.模块 1.什么是模块? 一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 2.为何要使用模块? 如果你退出python解释器然后重新进入,那么你之前定义的函 ...

随机推荐

  1. 代码实现:从键盘输入接收一个文件夹路径,打印出该文件夹下所有的.java文件名

    package com.loaderman.test; import java.io.File; import java.io.FileReader; import java.util.Scanner ...

  2. 解决:Oracle 异常 ORA-01861: literal does not match format string(字符串格式不匹配)

    今天在写存储过程的时候,老是报一个错.如下,记录下来,以供日后查阅. 报错:  Oracle 异常 ORA-01861: literal does not match format string(字符 ...

  3. Tomcat远程调试参数

    Linux: 关闭防火墙 vim catalina.sh export CATALINA_OPTS="-server -Xdebug -Xnoagent -Djava.compiler=NO ...

  4. jmeter设置全局变量与正则表达式提取器

    接口测试中,很多接口都要带上登录后的token才能正常发送请求,这里记录一下登录获取token设置为全局变量供其他接口使用 登录后返回信息信息中会有一个token值,添加后置处理器中的正则表达式提取t ...

  5. python多媒体文件抽取

    多文件抽取有:只获取url,或直接下载,下面是怎么将数据下载下来,并显示进度. 本节主要介绍urllib模块提供的urlretrieve()函数.urlretrieve()方法直接将远程数据下载到本地 ...

  6. 用fiddler来学http协议:为什么会有“response body is encoded click to decode”

    使用fiddler查看服务器返回的响应包的时候,我们常常会看到“response body is encoded click to decode”这样一个提示,只有点击它才能让响应包的主体内容从乱码变 ...

  7. 【HANA系列】SAP HANA SQL条件判断是NULL的写法

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA SQL条件判断 ...

  8. LeetCode.1108-使IP地址无效(Defanging an IP Address)

    这是小川的第393次更新,第426篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第257题(顺位题号是1108).给定有效(IPv4)IP地址,返回该IP地址的无效版本. ...

  9. Ciso三层交换 上vlan间互通, 端口映射到vlan

    路由器2911配置: !hostname router interface GigabitEthernet0/0 ip address 10.0.0.2 255.0.0.0 ip nat outsid ...

  10. Tensorflow实战第十课(RNN MNIST分类)

    设置RNN的参数 我们本节采用RNN来进行分类的训练(classifiction).会继续使用手写数据集MNIST. 让RNN从每张图片的第一行像素读到最后一行,然后进行分类判断.接下来我们导入MNI ...