欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

从零开始的Python学习Episode 16——模块

程序员文章站 2023-02-21 11:09:47
一、模块 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在Python中,一个.py文件就称之为一个模块(Mo ......

一、模块

在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。

为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在python中,一个.py文件就称之为一个模块(module)

 

模块导入的方法

1.import 

import module1[, module2[,... modulen]

这种方法在使用模块中的函数的时候需要在前面加上它所属的模块,像这样

import fun
fun.tools()

否则无法正确调用模块中的函数。

2.from…import

from modname import name1[, name2[, ... namen]]

这种方法不会将整个模块中的内容导入到当前的命名空间中,只会将它里面的name1或name2单个引入到执行这个声明的模块的全局符号表。

3 .from…import* 

导入一个模块中的所有项目。然而这种声明不该被过多地使用。大多数情况, python程序员不使用

这种方法,因为引入的其它来源的命名,很可能覆盖了已有的定义。

 

这些方法的运行本质则是先通过sys.path找到模块,然后执行模块的脚本(全部执行,即将模块中的所有语句执行一遍),区别是方法1会将模块的变量名加载到名字空间,而2只会将name1这个变量名加载进来。

 

二、包

 

如果不同的人编写的模块名相同怎么办?为了避免模块名冲突,python又引入了按目录来组织模块的方法,称为包(package)。

举个例子,一个abc.py的文件就是一个名字叫abc的模块,一个xyz.py的文件就是一个名字叫xyz的模块。

现在,假设我们的abcxyz这两个模块名字与其他模块冲突了,于是我们可以通过包来组织模块,避免冲突。方法是选择一个顶层包名:

                         从零开始的Python学习Episode 16——模块

引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。现在,view.py模块的名字就变成了hello_django.app01.views,类似的,manage.py的模块名则是hello_django.manage。

请注意,每一个包目录下面都会有一个__init__.py的文件,这个文件是必须存在的,否则,python就把这个目录当成普通目录(文件夹),而不是一个包。__init__.py可以是空文件,也可以有python代码,因为__init__.py本身就是一个模块,而它的模块名就是对应包的名字。

调用包就是执行包下的__init__.py文件

 

注意:

从零开始的Python学习Episode 16——模块

1 from tools import show
2 show()

这样使用的时候,在pycharm上运行不会出错原因是pycharm将mod这一层的路径加入到了sys.path中,但是如果程序不在pycharm中运行的时候则会报错。

解决方法:手动将路径加到sys.path中

from tools import show
import sys,os
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
#找到mod这一层的路径
sys.path.append(base_dir)
show()

 

1.__name__

如果我们是直接执行某个.py文件的时候,该文件中那么”__name__ == '__main__'“是true,但是我们如果从另外一个.py文件通过import导入该文件的时候,这时__name__的值就是我们这个py文件的名字而不是__main__。

这个功能还有一个用处:调试代码的时候,在”if __name__ == '__main__'“中加入一些我们的调试代码,我们可以让外部模块调用的时候不执行我们的调试代码,但是如果我们想排查问题的时候,直接执行该模块文件,调试代码能够正常运行!