目录
模块
什么事模块
模块:是一系列功能的集合体,而函数是某一功能的集合体,因此模块可以看成是一堆函数的集合体。一个py文件内部就可以放一堆函数,因此一个py文件就可以看成一个模块。
模块的三种来源:
1:内置(python解释器自带的)
2:第三方的(别人写的)
3:自定义的(自己写的)
模块的四种表现形式:
1:使用python编写的py文件
2:已被编译为共享库或DLL的C或C++扩展
3:内置模块,使用C编写并链接到python解释器的内置模块
4 :把一系列模块组织到一起的文件夹(文件下游一个_init_.py文件,该文件称之为包。)
为什么要用模块
1:用别人写好的模块(内置,第三方):典型的拿来主义,极大的提高了开发效率。
2:使用自己写的模块:将我们自己程序中用到的公共功能,写入一个python文件,然后程序的各部分组件可以通过导入的方式来引用自定义模块的功能。
如何使用模块
一般使用 import 和 from...import... 导入模块。
# mod.py 文件
print('from mod')
hobby = 'read'
def func1():
print('from mod func1',hobby)
def func2():
print('from mod func2')
def func3():
global hobby
hooby = 'run'
import 模块名
# run.py 文件
import mod # 导入文件名时,不要加 py
hobby = 'play'
mod.func1() # ---> 需要引用模块功能时,需要 (模块名.模块文件中的名字) 使用
mod.func2()
mod.func3()
print(hobby) # ---> 不使用 (模块名.模块文件中的名字),只会在自己名称空间去寻找所对应的值
# from mod
# from mod func1 read
# from mod func2
# play
- import 首次导入模块发送了3件事:
1:执行模块文件。
2:运行模块文件中的代码,将产生的名字与值存放到当前模块的名称空间中。
3:在执行文件中产生一个指向被导入模块的名称空间的名字。
2:执行模块对应的文件
注意:多次导入不再执行模块文件,会沿用第一次导入的成果。
- 当模块文件名过于复杂时
# 假设需要导入的模块 xxooaatt.py
import xxooaatt as x # 导入模块名后加 as 加你认为方便使用时的名
# xxooaatt.模块文件中的名字
# 现在只需要:
# x.模块文件中的名字
- 导入多个模块
# 导入多个模块,用逗号隔开
import time,sys,os # 不推荐使用
from 模块名 import 具体的功能
from mod import hobby
# 导入模块后,就类似于
# hobby = 'run' 提前定义过了
hobby = 'play' # 覆盖
print(hobby)
# from mod
# play
- from...import... 首次导入模块发生了3件事:
1:执行模块文件。
2:运行模块文件中的代码,将产生的名字与值存放到当前模块的名称空间中。
3:在当前执行文件的名称空间中拿到一个名字,该名字直接指向模块中的某一个名字,意味着可以不用加模块名这个前缀而直接使用。
- 优点:不用加前缀,代码更加精简。
- 缺点:不加前缀容易与当前执行文件中名称空间中的名字冲突。
import 和 from...import 的异同之处
相同点:
1:两者都会执行模块对应的文件,两者都会产生模块的名称空间。
2:两者调用功能时,需要跑到定义时寻找作用域关系,与调用位置无关。
不同点:
1:import 需要加前缀,from...import... 不需要加前缀。
_all_ 使用方法
# 在被导入的模块中使用,限制其导入功能的个数
__all__ = ['hobby'] # 只允许导入 honny
__all__ = []
# 不添加内容,则默认可以导入全部
__name__使用方法
- 当文件被当作执行文件执行的时候__name__打印的结果是__main__
- 当问及被当作模块导入的时候__name__打印的结果是模块名(没有后缀)
# mod.py 文件
def func():
print('from mod func')
print(__name__)
if __name__ == '__main__': # 快捷方式输入 main 回车
func()
# run.py 文件
import mod
print(__name__)
# mod # 文件名
# __main__