在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。
为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在Python中,一个.py文件就可以称之为一个模块(Module)。
模块和包的定义
在Python中一般对文件和文件的称呼(很多开发者的平时开发中也有人都称为模块)
- 一个py文件,模块(module)。
- 含多个py文件的文件夹,包(package)。
注意:在包(文件夹)中有一个默认内容为空的__init__.py
的文件,一般用于描述当前包的信息(在导入他下面的模块时,也会自动加载)。
- py2必须有,如果没有导入包就会失败。
- py3可有可无。
使用模块有什么好处
最大的好处是大大提高了代码的可维护性。其次,编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包括Python内置的模块和来自第三方的模块。
使用模块还可以避免函数名和变量名冲突。每个模块有独立的命名空间,因此相同名字的函数和变量完全可以分别存在不同的模块中,所以,我们自己在编写模块时,不必考虑名字会与其他模块冲突
模块导入&调用
查找路径
当定义好一个模块或包之后,如果想要使用其中定义的功能,必须要先导入,然后再能使用。
导入,其实就是将模块或包加载的内存中,以后再去内存中去拿就行。
关于导如时的路径:
在Python内部默认设置了一些路径,导入模块或包时,都会按照指定顺序逐一去特定的路径查找。
import sys
print(sys.path)
['当前执行脚本所在的目录',
'D:\\Anaconda3\\python36.zip',
'D:\\Anaconda3\\DLLs',
'D:\\Anaconda3\\lib',
'D:\\Anaconda3',
'D:\\Anaconda3\\lib\\site-packages',
'D:\\Anaconda3\\lib\\site-packages\\win32',
'D:\\Anaconda3\\lib\\site-packages\\win32\\lib',
'D:\\Anaconda3\\lib\\site-packages\\Pythonwin']
说明:
- 这里我使用的Anaconda,
sys.path
在不同的安装路径和Python版本下可能有所不同 - 如果使用的是Pycharm,会把当前项目目录加入
sys.path
,但是代码运行时是没有Pycharm的,因此不要考虑这个路径
想要导入任意的模块和包,都必须写在如下路径下,才能被找到。
也可以自动手动在sys.path中添加指定路径,然后再导入可以,例如:
import sys
sys.path.append("路径A")
import xxxxx # 导入路径A下的一个xxxxx.py文件
模块加载流程
被导入的模块文件.py
全部执行一遍,if __name__ == "__main__":
部分不会被执行
如果模块已经被导入在内存中,不会被再次导入
三种导入
import导入
import应用场景:项目根目录的包、模块级别的导入。
注解:单层的模块、单层包下的模块
# many.py
def show():
pass
def hide():
pass
# 导入一个模块
import many # many输入项目根目录下的模块
v1 = many.show()
import commons.page as pg # commons输入项目根目录下的包
v2 = pg.pagination()
# 导入一个包
import commons
print(commons.VERSION) # 导入的包可以直接调用该包下面__init__.py文件的变量
# 多层包下的模块无法导入
# import commons.tencent.wechat
from导入
from比import更强大,可以导入嵌套的包、模块、成员
嵌套的包wechat
# 导入成员
from many import show, hide
from commons.utils import encrypt
v1 = encrypt("ecithy")
print(v1)
# 导入一个模块(至少一个嵌套)
from commons import utils
utils.encrypt("xxx")
utils.f1()
# 导入一个包(至少一个嵌套)
from commons import tencent
如果要调用多层嵌套包下的模块,import 前必须要是当前模块的直接上级包
因为在调用时不能 包名.模块
,只能模块.成员
from commons.tencent import wechat
from commons.tencent.wechat import yue
相对导入
导入别名
如果项目中导入 成员/模块/包 有重名,那么后导入的会覆盖之前导入,为了避免这种情况的发生,Python支持重命名,即:
from xxx.xxx import xx as xo
import x1.x2 as pg
除此之外,有了as的存在,让 import xx.xxx.xxxx.xxx 在调用执行时,会更加简单(不常用,了解即可)。
- 原来 ```python import commons.page
v1 = commons.page.pagination()
- 现在
```python
import commons.page as pg
v1 = pg.pagination()
name
执行一个py文件时
__name__ = "__main__"
导入一个py文件时
__name__ = "模块名"
主文件,其实就是在程序执行的入口文件,例如: