目录
模块
是一种代码的打包手段。它是python中最高级别的组织结构,也是最高层次的代码重用手段
当一些代码在程序中重复出现时,就会导致冗杂局面出现,这时我们就会把它打包成函数的形式,这样只需要调用函数就可以实现代码的重复使用,我们学到的第一种代码打包手段就是函数;
后来我们学习了类和对象,发现可以从另外一个思路解决代码打包问题。类和对象来源于对现实世界的模拟,运用类和对象的打包思维,任何事物都可以被看做是属性和方法的有机结合,属性决定了对象的静态特征,方法实现了对象的动态能力。
但是类不是最高级别的打包方案。打包是为了重用,类是在一个程序里被重复实例化为多个对象而已,比类更厉害的打包方案是模块,它使得一个或多个源代码文件可以被其他程序重复使用
在python中导入模块通常有三种方案
- import+模块名(使用这种方案导入,在调用模块中的对象时要使用<模块名>.<对象名>的形式进行访问)
- from+模块名+import+对象名(直接从模块导入所需对象)
- import+模块名+as+关联名
if __name__=="__main__"
在阅读开源代码时经常看到 if __name__=="__main__" 这行语句,那么__name__是什么?"__main__"是什么? 见以下解析
摄氏度和华氏度的相互转换的程序相当于一个模块(HS模块),如果我们试图在另一个源文件中导入该模块就会出现问题:在HStest.py源代码文件中,仅有两行打印语句,但执行起来却打印了四行
我们在导入的HS模块中,自身就有两行用于测试的打印语句,这里一并被执行(模块在导入过程中,会从头到尾执行一遍导入模块中的所有语句)
解决方法: if __name__=="__main__"
当一个模块被作为脚本独立执行时,它的__name__属性就会被赋值为"__main__",因此,只要在模块执行代码之前判断__name__是否等于"__main__"就可以解决问题
那么如果HS.py作为模块导入到其他程序中,此时__name__是什么?值是HS(作为模块导入时,name值是模块名,而非"__main__")
包
1.在实际开发中,一个大型项目常常会涉及到很多源代码文件,如果将它们都放到一起,可能产生混淆,如果此时能通过文件夹的形式将这些源代码文件进行整理分类,就比较条理清晰。
2.python发明了package,它允许我们通过点号(.)将源文件组织成多个分级的形式,也就是支持我们将模块分门别类,然后存储到不同的文件夹中。
3.以华氏度和摄氏度的转换程序为例:先创建一个文件夹aa,将HS.py移动到文件夹中,修改HStest.py(导入模块时使用点号(.)将包与模块分隔)
4.如果多个包叠加,访问模块时会费劲,两种方法解决问题:
- 使用import..as...语法,给模块取一个别名,访问时直接使用别名即可
- 利用__init__.py这个包的构造文件,我们可以让包在导入时自动导入模块
遏制from...import * 的附加伤害
from...import *:意思是导入模块中的所有内容。使用需谨慎,毕竟模块中包含了大量的其他程序,不需要用到的变量、函数和类直接全部导入,就会造成命名空间的污染,可以用__all__属性遏制它的伤害。在模块中使用__all__属性,就可以指定 from...import * 所能导入的内容
__all__属性可以作用于包:对于包来说,如果没有定义__all__,那么 from...import * 的语法不导入包里面的任何模块