模块
就象工具包,要想使用工具包中的工具,就需要导入(import)
这个模块- 每个以
.py
结尾的Python
源代码文件都是一个模块
- 在模块中定义的
全局变量
、函数
、类
都是模块
能够提供给外界直接使用的工具
import 导入
import 模块名1 [ ,模块名2 [ , ...模块名n ]
# 新建 py_model1.py
name = '东软睿道'
def sayhello():
print('hello')
name = 'zhang3'
# 新建 py_model_test1.py
import py_model1
py_model1.sayhello()
print(mode1.name)
hello
zhang3
- 在一个Python文件中定义的
变量
或函数
,可以在另一个文件中用import
导入这个模块。- 导入之后,就可以使用
模块名.变量
或模块名.函数()
的方式,使用模块中定义的变量
或者函数
。- 模块的作用是,实现代码复用!
import 模块名 as 模块别名
- 如果
模块名
太长,可以使用as
指定模块的别名
- 如果指定了
别名
,就不能再使用原来的模块名
from...import 导入
import
一次性把模块中所有的函数和变量都导入当前文件- 如果希望从模块中导入部分工具,可以使用
from ... import
方式
from 模块名 import 函数 [, 类 [, ...变量 ] ] [as 别名]
- 这种方式导入之后,可以直接使用模块中定义的
函数
、类
和变量
# 新建 py_model_test2.py
from py_model1 import sayhello
from py_model1 import name
sayhello()
print(name)
hello
zhang3
- 如果两个模块中存在同名函数,那么后导入的函数会覆盖之前的函数
- 通常将
import
写在文件开始,之样更容易发现冲突,如果冲突不可避免,可以使用as
关键字进行重命名
from...import * 导入
from 模块名 import *
- 导入模块中所有的函数和变量
- 这种方式不推荐使用,容易造成函数重名,并且没有提示
模块搜索顺序
- Python解释器在导入模块时,会先搜索
当前目录
,如果有就直接导入;如果没有,再搜索系统目录
- 文件命名不要和系统的模块文件重名
- 每一个模块都有一个内置属性
__file__
可以查看模块的绝对路径
隐藏模块中的内容
- 导入文件时,任何没有缩进的代码都会被执行一遍!
# model1.py
print("model")
# testmodel1.py
import model1
运行testmodel1会输出
model
__name__
属性中保存着一个字符串,其值在当前模块中为__main__
,导入其它模块时为模块名
- 利用
if
语句判断__name__
的值是否为__main__
,使代码只在当前模块
内执行- 这种
if
语句形式相当于其它语言中的main方法
if __name__ == "__main__":
仅在当前文件使用的代码
包
包
用来管理Python模块的命名空间
,采用包名.模块名
的形式来避免模块名重名,只要把模块放在不同的包中,就不用担心产生名字冲突。
- 创建包
- 创建目录
- 在目录中创建
__init__.py
文件,指定对外界提供的模块
列表- 在目录中添加
文件(模块)
目录结构
mycompany
├─ __init__.py
├─ abc.py
└─ xyz.py
- 引入
包
以后,只要顶层包名不冲突,目录中的模块
也不会冲突,因为模块abc
的名字变成了mycompany.abc
- 每个
包目录
下都有一个__init__.py
文件,否则,系统会把这个目录当成普通目录__init__.py
文件用于指定对外界提供的模块列表
# __init__.py
from . import abc
from . import xyz
- 可以有多级目录,组成多级层次的包结构
mycompany
├─ web
│ ├─ __init__.py
│ ├─ utils.py
│ └─ www.py
├─ __init__.py
├─ utils.py
├─ abc.py
└─ xyz.py
- 文件
www.py
的模块名是mycompany.web.www
- 两个
utils.py
文件的模块名分别是mycompany.web.utils
和mycompany.utils
- 自己创建的模块名,不能和Python自带的模块名冲突
从包中导入模块
import mycompany.web.utils # 必须使用全名访问函数:mycompany.web.utils.func()
from mycompany.web import utils # 导入子模块,使用模块名访问函数:utils.func()
from mycompany.web.utils import func # 导入函数,直接访问函数:func()
- 使用
from package import item
的形式导入,item
可以是子包
、函数
、类
或变量
,可以直接使用导入的元素名访问- 使用
import package.item
的形式导入,item
只能是子包
或模块
,必须使用导入元素的全名访问
- end -