Python的学习之旅———模块与包的使用 常用模块

一:import

导入模块,只会在第一次导入时执行源文件的代码
如果模块已经加载到内存了,下一次导入直接引用内存中导入的结果

eval:提取字符串内的表达式执行,然后返回执行结果

import 导入文件都做了哪些事?

1 以源文件为准产生一个名称空间
2 以刚刚产生的名称空间为准,执行源文件的代码
3 会在当前文件中定义一个名字,这个名字就是模块名,用来引用模块中的名字

为模块起别名

import spam as sm

1 engine_type='mysql'
2 if engine_type == 'mysql':
3      import mysql as engine
4 elif engine_type == 'oracle':
5      import oracle as engine
6 engine.parse()

可以把两个不同的模块引入时候起相同的别名 ,做到调用的时候统一化。小技巧

在一行导入多个模块

1 import sys,os,re

二 使用模块之from ... import...

from spam import read1,read2,moeny

直接导入了spam中的 函数 read1 和read2 的名字 也可以导入变量名字 money

这样使用的时候就不用以spam.read1()的方式调用函数了.

from spam import *

一下把spam.py中的所有名字都引入了

如果引入的模块中有__all__=['字符串函数名','字符串变量名']那么

from spam import * 中* 对应模块spam内的__all__列表内的名字。

三模块的重载 

考虑到性能的原因,每个模块只被导入一次,放入字典sys.module中,如果你改变了模块的内容,你必须重启程序,python不支持重新加载或卸载之前导入的模块,

有的同学可能会想到直接从sys.module中删除一个模块不就可以卸载了吗,注意了,你删了sys.module中的模块对象仍然可能被其他程序的组件所引用,因而不会被清楚。

特别的对于我们引用了这个模块中的一个类,用这个类产生了很多对象,因而这些对象都有关于这个模块的引用。

如果只是你想交互测试的一个模块,使用 importlib.reload(), e.g. import importlib; importlib.reload(modulename),这只能用于测试环境。

四py文件模块与脚本的区别

复制代码

 1 编写好的一个python文件可以有两种用途:
 2     一:脚本,一个文件就是整个程序,用来被执行
 3     二:模块,文件中存放着一堆功能,用来被导入使用
 4 
 5 
 6 python为我们内置了全局变量__name__,
 7     当文件被当做脚本执行时:__name__ 等于'__main__'
 8     当文件被当做模块导入时:__name__等于模块名
 9 
10 作用:用来控制.py文件在不同的应用场景下执行不同的逻辑
11     if __name__ == '__main__':

复制代码

__name__的判断要在写在模块(脚本程序中)

文件spam.py当做脚本执行,该值等于__main__,文件spam.py当做模块被导入时,该值等于脚本名(spam)

五 模块的搜索路径

模块的查找顺序是:内存中已经加载的模块->内置模块(系统内置那些)->sys.path路径中包含的模块

1 import sys
2 sys.path.append(r'文件路径\a')   a是文件夹
3 import m
4 也可以先去找到a 然后顺着a找到m(a和执行文件是在同一个目录下)
5 from a import m

把文件的路径加入系统环境变量中,这是加入一次,而不是永久写入。

六 包介绍

1包是一种通过使用‘.模块名’来组织python模块名称空间的方式

复制代码

具体的:包就是一个包含有__init__.py文件的文件夹,所以其实我们创建包的目的就是为了用文件夹将文件/模块组织起来

#需要强调的是:
  1. 在python3中,即使包下没有__init__.py文件,import 包仍然不会报错,而在python2中,包下一定要有该文件,否则import 包报错

  2. 创建包的目的不是为了运行,而是被导入使用,记住,包只是模块的一种形式而已,包的本质就是一种模块

复制代码

2需要注意的是

复制代码

#1.关于包相关的导入语句也分为import和from ... import ...两种,
但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:
凡是在导入时带点的,点的左边都必须是一个包(也就是说文件夹下必须有__init__.py这个文件),否则非法。
可以带有一连串的点,如item.subitem.subsubitem,
但都必须遵循这个原则。但对于导入后,在使用时就没有这种限制了,
点的左边可以是包,模块,函数,类(它们都可以用点的方式调用自己的属性)。

#2、import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件即包下的__init__.py,导入包本质就是在导入该文件

#3、包A和包B下有同名模块也不会冲突,如A.a与B.a来自俩个命名空间

复制代码

包的标志就是包含__init__.py这个文件。

图列:

 模块导入的时候都会做三件事 

1 以源文件为准产生一个名称空间
2 以刚刚产生的名称空间为准,执行源文件的代码
3 会在当前文件中定义一个名字,这个名字就是模块名,用来引用模块中的名字

总结

复制代码

1 import包的时候 建议使用 from ...import的形式。这样就不用sys.path.append(r'包的路径')
2 
3 from可以用来指定路径  import决定需要获取的名称空间
4 
5 运行文件和包在同一文件夹下的时候 可以直接import
6 
7 运行文件和包不在同一文件夹下的时候c:\a\b\c\d\ 运行文件在a下  包在d下 那么就需要在运行文件中首先导入sys.path.append(r'c:\a\b\c\d')
  包以及包所包含的模块都是用来被导入的,而不是被直接执行的。而环境变量都是以执行文件为准的

复制代码

 执行文件调用包内名称的方式决定了from 路径结构

第一种

复制代码

1 执行文件中
2 import a
3 a.f1()
4 a.f2()
5 a.f3()

6 a包 __init__中的代码
7 from .am1 import f1       #等同于绝对路径from a.am1 import f1 
8 from .am2 import f2 9 from .b.bm1 import f3

复制代码

第二种

执行文件中
import a.b.bm1
a.b.bm1.f3()

a包 __init__中没有代码

第三种

1 执行文件中
2 from a.b.bm1 import f3
3 f3()

4 a包 __init__中没有代码

 第一种依赖包中__init__ ,第二种是不依赖__init__.

猜你喜欢

转载自blog.csdn.net/thy822/article/details/81235666