Python3之模块浅谈

日期:2020年2月16日
作者:Commas
注释:学习就是为了忘记,接上一章《Python3之面向对象小结》,现在讲一下单例;
如果您想了解更多有关Python的知识,那么请点《我的Python浅谈系列目录》


文章目录

  • 一、模块的概念与开发原则
  • 二、模块的导入与命名空间的关系
  • 三、模块的搜索顺序


一、模块的概念与开发原则

模块就是一个工具包,这个工具包(模块)对外提供全局变量、函数、类三种类型的工具,工具包名称(模块名)实则是一个标识符,需要满足标识符命名规范(此知识不再赘述,想了解请看我的另一篇博客《Python3之命名规范浅谈》),而模块的本质就是以.py为扩展名的源代码文件。
模块的开发原则也很简单,就是每一个文件应该是可以被导入的,我们可以理解为:

  1. 模块中所有没有任何缩进的代码都应该被执行一遍,加载到内存,以供调用者使用;
  2. 模块中的测试代码应该保证仅在其内部使用,而被导入到其他文件中应该不被执行;
    这么一看,那么问题来了,我们该如何让测试代码满足以上的执行条件呢?接下来我们需要学习一下python中的一个内置属性__name_,此属性记录着一个字符串,详情如下表:
分情况讨论 __name__值
模块为当前执行程序时 ‘_ main _’(双下划线字符串)
模块被其他文件导入时 被导入模块名

由此,我们可以好好使用这个属性,将我们的测试代码放入其中,如下:

if __name__ = "__main__":
	# 此处写测试代码
	pass

这样,我们的测试代码仅在模块为当前执行程序时,被导入将不再执行,大功告成!最后,给出推荐的模块代码格式,如下:

# 导入模块
# 定义全局变量
# 定义类
# 定义函数

def main():
	"""
	此处为测试代码,是否已解惑各位同学们心中那些年的疑惑呀?
	"""
	pass
	
if __name__ = "__main__":
	"""
	仅在模块为当前执行程序时,执行main();
	被其他文件导入时,将不再执行main()
	"""
	main()

二、模块的导入与命名空间的关系

学习了模块的概念以及如何开发一个标准的模块后,不由自主地思考着,模块既然是工具,那么该如何导入以及使用,总共有几种导入的方法呢?那么继续看下文:

  1. import导入
# 【导入模块】:在导入模块时,每个导入过程应该独占一行
# (1)直接导入
import 模块名1
import 模块名2
# (2)模块名取别名,as后面接“模块别名”
import 模块名3 as3

# 【使用工具】:模块的调用
# 全局变量(或 方法名)相同,但是不冲突,原因是命名空间将其变量隔离
# 三个模块,对应三个不同的命名空间
模块名1.变量名1
模块名2.变量名13.变量名1

模块名1.方法名1()
模块名2.方法名1()3.方法名1()
  1. from … import …
# 【导入工具】:从模块导入某一个工具
# (1)直接导入
from 模块名1 import 工具名1
from 模块名1 import 工具名2
# (2)工具名取别名,as后面接“工具名别名”
from 模块名2 import 工具名2 as22

# 【使用工具】:工具的调用
# 为什么“模块名2”中的工具名2要取别名?
# 因为“模块名1”中的工具名2会被“模块名2”的工具名2覆盖
# 为什么变量会被覆盖?
# 因为这些变量都在同一个命名空间(即当前执行程序的模块)中
工具名1()
工具名2()22()

另外一个导入模式了解就好,因为不好排查变量覆盖问题,如下:

# 从“模块名1”中导入所有的工具(全局变量、函数、类)
from 模块名1 import *

三、模块的搜索顺序

  1. 搜索当前目录,若模块名存在,则直接导入,否则继续搜索;
  2. 搜索系统目录,若模块名存在,则直接导入,否则调用模块中的方法时,将会抛出异常;

Python3之模块浅谈_第1张图片
每一个模块中都有一个内置属性__file__属性,可以查询当前模块所在的路径,示例如下:

import http
print(http.__file__)
# 控制台输出:
D:\Python\Python37\lib\http\__init__.py

版权声明:本文为博主原创文章,如需转载,请给出:
原文链接:https://blog.csdn.net/qq_35844043/article/details/104339709

你可能感兴趣的:(Python3)