前言
模块
1.模块概述
在python中,一个.py文件就是一个模块,模块可以被别的程序引入,方便使用该模块中函数等功能。
引入的模块包括python内置的模块和来自第三方的模板。
一个python程序通常包含一个顶层程序文件和其他的模块文件(0个,1个或者多个)
顶层文件:包含程序的主要控制流程。
模块文件:为顶层文件或其他模块提供各种功能性组件。
模块首次导入时,会立即执行模块文件的顶层程序代码(不在函数内的代码),位于函数内的代码要等到函数被调用的时候才会执行。
多个函数存放在一个.py文件中才能称为模块。
举例:import导入了sys模块,利用sys这个变量就可以访问sys模块的所有功能。
import sys
def test():
args = sys.argv
if len(args) == 1:
print("hello,world!")
elif len(args) ==2:
print("hello,%s"%args[1])
else:
print("too many arguments!")
if __name__ == '__main__':
test()
2.模块的导入
1.直接使用import 导入模块
这需要满足一个前提,py执行文件和模块文件属于同一个目录(父级目录)。
常见的有三种:
1.import语句
想使用python源文件,只需在另一个源文件中执行import语句,如果模块在当前的搜索路径就会被导入,搜索路径是一个解释器会先及逆行搜索的所有目录的列表,import命令放在脚本的顶端。
一个模块只会被导入一次,在导入一次之后会加载到内存,之后的调用都是只想内存的,这样可以防止导入模块一遍一遍的执行。
2.from…import语句
从模块中导入一个指定部分到当前的命名空间中
3.from…import语句
把一个模块中的所有内容都导入到当前的命名空间
三者存在区别:
import模块:导入一个模块相当于导入的是一个文件夹,是个相对路径。
from…import:导入一个模块中的一个函数,相当于导入的是一个文件夹中的文件,是个绝对路径。
from…import:把一个模块中的所有函数的都导入进来,相当于导入的是一个文件夹中的所有文件,所有函数都是绝对路径。
2.通过sys模块导入自定义模块的path
如果执行文件和模块不在同一个目录,需要先导入sys模块,然后通过sys.path.append(path)函数来导入自定义模块所在的目录,最后再导入自定义模块。
或者使用pth文件找到自定义模块:通过pth文件找到自定义模块利用了系统变量,python会扫描path变量的路径来导入模块,可以再系统path里面添加。先创建一个.pth文件,文件的内容就是自定义模块所在的目录,将此文件放入python安装目录,在执行文件中即可导入并使用自定义模块。
3.第三方库的使用
在第三方模块安装好之后,搜索路径就已经设置好了,默认情况夏,python解释器会搜索当前目录,所有已安装的内置模块和第三方模块,搜索路径放在sys模块的path变量中。
如果我们要添加自己的搜索目录,有两种方法:
1.利用appened()函数,直接修改sys.path,添加要搜索的目录
这种方法在运行时修改,运行结束后直接失效
2.设置环境变量PYTHONPATH,该环境变量的内容会被直接添加到模块搜索路径中。
4.包
每一个包目录下都会有一个__init__.py文件,这个文件是必须存在的,否则就会把这个目录当成普通目录,这个文件可以是一个空文件,也可以含有代码,因为__init__.py本身就是一个模块。
包中模块的调用同模块调用方法。
第一次导入包的任何部分,就会执行__init__.py文件中的代码,其中变量和函数会自动导入
#bao.__init__.py
name = 'MyName'
print('包中的name',name)
#bao.MyPyModel.py
class MyTestModel:
def __init__ (self,value=10):
self.value = value
def getValue(self):
return self.value
def setValue(self,value):
self.value = value
#其他包中的脚本
import bao.MyPyModel
if __name__ == '__main__':
test = bao.MyPyModel.MyTestModel(20)
print(test.getValue())
print('outside',bao.name)
运行结果:
包中的name MyName
20
outside MyName