鱼c笔记——Python模块(二)
模块的主要作用:
①封装组织Python的代码。当代码量很大的时候,我们可以有组织有纪律的根据不同的功能将代码分割成不同的模块,这样每个模块之间都是分隔开的,更容易阅读和测试。
②实现代码的重用。
if __name__ == '__main__':
下面有两个文件,其中TemperatureConversion.py是转换华氏温度和摄氏温度的模块,cal.py则是导入该模块的一个程序:
下图是TemperatureConversion.py里的代码。
最后加入了test()函数测试程序
得到的结果是:
cal.py里的代码是:
运行结果是:
在写一个模块时,我们会在模块内对它进行单独的测试,而不是等到组装好后测试。因为一个大程序有很多个模块,组装好后测试麻烦。
我们不难看出Python不自觉的把模块中的测试代码打印出来了。
在主程序中为了避免将模块中的测试代码打印出来,我们应该让Python知道该模块是作为程序运行,还是导入到其他程序中。
为了实现这点,我们可以用__name__变量。而__name__变量有以下特性:
①如果是在主程序里使用__name__, 得到的是'__main__'
②如果是在模块中调用__name__,得到的是模块名
所以我们可以将模块中的test()函数改为:
这样就不难理解if __name__ == '__main__':的含义了。
写好的模块应该放在哪里?
方案一:和导入这个模块的源文件放在同一个文件夹
但是我们并不希望把所有的文件都放在同一个文件夹里,我们想通过文件夹的方式更好的组织我们的代码。
在此之前,我们应该理解搜索路径这个概念。
Python模块的导入需要一个路径搜索的过程,也就是说我们如果想要导入一个叫hello的模块,Python会在预定义好的路径里找一个叫hello.py的模块文件,如果有,则导入模块,如果没有,则导入失败。
而这个搜索路径就是一个列表,我们可以通过sys模块里的path变量将其显示出来。
>>> import sys
>>> sys.path
['', 'C:\\Program Files\\Python36\\Lib\\idlelib', 'C:\\Program Files\\Python36\\python36.zip', 'C:\\Program Files\\Python36\\DLLs', 'C:\\Program Files\\Python36\\lib', 'C:\\Program Files\\Python36', 'C:\\Program Files\\Python36\\lib\\site-packages']
也就是说Python会从这一个个的路径里面去搜索有没有我们要导入的模块文件。
最佳存放模块的路径是含“site-package”的那个路径
方案三:另外我们只需要告诉Python模块文件在哪里找,Python在导入模块的时候就可以找到它。
>>> import sys
>>> sys.path.append("你所需要导入模块文件的路径")
>>> import 你所需的模块
包(package):在实际开发中,一个大型的系统有成千上万个模块。用模块来定义Python的功能还不够,如果将这些模块文件全部放在一个文件夹下,会显得混乱,而且有命名冲突的可能,因此Python中出现了包的概念,包有点类似于方案三:把模块分门别类的放在不同文件夹下,然后把各个文件夹的位置告诉Python,但是包的做法更为简洁。
创建一个包:
①创建一个文件夹,用于存放相关的模块,文件夹的名字即包的名字。
②在文件夹中创建一个文件名为__init__.py的模块文件,内容可以为空
③将相关的模块放入文件中
接下来就是导入包中的模块,用 import 包名.模块名 (as 模块名的新名) 的形式就行
当然,包创建的位置得是在Python搜索路径之下的