Python之模块和包的创建与使用
一、模块的概念
在计算机的开发过程中,随着程序代码越写越多,在一个文件里代码就越来越长,越来越不容易维护。
为了编写可维护的代码,我们把很多函数分组,放在不同的文件里面,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在PYthon中,一个 .py 文件就称之为一个模块(Module)。
二、使用模块的好处
最大的好处是大大提高了代码的可维护性。
其次,编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包括Python内置的模块和来自第三方的模块
另外,使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,在编写模块时,不必考虑名字会和其他模块冲突。但也要注意,尽量不要与内置函数名字冲突
三、模块的种类
* Python 标准库
*第三方模块
*应用程序自定义模块
四、模块的导入方式
示例文件:
文件 cal.py
#!/usr/bin/env python # -*- coding:utf8 -*- def add(x,y): return x+y def sub(x,y): return x-y
1. import 语句
# 原理:
① 将i mport 的文件的执行一遍
② 将变量名引入
# 输出 import 查找变量的默认路径:
import sys print(sys.path)
# 注意:若要在当前目录下存在和要引入模块同名的文件,就会把要引入的模块屏蔽掉
import cal print(cal.add(3,5))
2.from .... import 语句
# 这个声明不会把整个 cal 模块导入到当前的命名空间中,只会将它里面的 add 或 sub 单个引入到执行这个声明的模块的全局符号表
from cal import add from cal import sub
print(add(3,5)) print(sub(5,6))
3.form...import *
# 这个提供了一个简单的方法导入一个模块中的所有项目。然而这中声明不应该被过多的使用。
*** 大多数情况下,Python程序员不使用这种方法,因为引入其他来源的命名,很可能覆盖了已有的定义 ***
from cal import * print(add(3,5)) print(sub(5,6))
五、包(package)
为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称之为包(package)
举个例子,一个 xyz.py 的文件就是一个名字叫 xyz 的模块,一个 abc.py 的文件就是一个名字叫 abc 的模块,
假设我们的这两个模块名字和其他模块冲突了,于是我们可以通过包来组织模块,避免冲突。方法是选择一个顶层包名:
引入包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。现在,wsgi,py模块的名字就变成了hi_django.wsgi,类似的,app_web文件夹里面的migrations.文件夹里面的若存在abc.py,那它的模块名就是app_web.migrations.abc
请注意:每个包目录下面都会有一个__init__.py文件,这个文件是必须存在的。否则,Python就把这个目录当成普通目录(文件夹),而不是一个包。__init__.py可以是空文件,也可以有PYthon代码,因为__init__.py本身就是一个模块,而它的模块名就是对应包的名字
调用包及时执行包下面的__init__.py文件
六、__name__ 语句
* 在执行的 ,py文件中,print(__name__)打印出来的是 __main__
* 在主函数中调用了含有 print(__name__) 命令的模块,而主函数中也有 print(__name__) 命令。
执行主函数时,输出的是 模块所在的文件名 和__mian__
示例:
运行 cal.py 文件:
运行 bin.py 文件:
*** 使用方法及作用 ***
if __name__ == '__mian__': #建议所有自己写的.py文件里面都加上这个语句
# 可以用于调试 在编写模块时所写的的定义函数 (即用于被调用文件的测试)
——因为如果不是直接执行该模块,调试定义函数的命令就不会执行,可以放心的在别的函数里面调用该模块而不用担心它会出现一些运行结果混淆
# 表示 —不想该文件的里面的一些内容被其他文件调用
——如果别人直接将你的文件直接很顺利地调用过去,造成不是他的错误就是我的错误
示例:我写好的文件给别人去维护,如果别人不知道我的这个文件是启动程序,他就直接用到这个文件,他调用这个文件。如果他调用的话,是相对于把我所写的所有逻辑给运行了一遍,而他只是想用我写在该文件里面的一个函数。这就会产生bug