引言
在前面的文章中,我们介绍了变量、函数、类,在实际编程中,始终在贯彻的有两点:
1、在Python中一切皆对象,所以函数、类、模块、包也都是一等公民。
2、不管是基于面向过程还是面向对象,我们在实际编程中所考虑的都是怎么提高代码的复用性,以及如何更加便于扩展。
从变量,到函数,再到类,代码的服用层级是在不断提升的。从本文开始要介绍的模块和包是更高层级的代码的组织与复用形式。
本文会更加偏向于编程的思维及概念,主要内容大致如下:
1、模块化思想
2、Python中的模块和包
3、模块和包也是对象
模块化思想
其实模块化的思想由来已久,从工业革命、社会化大分工开始,就已经在应用模块化思想。
早期的工厂主、资本家,担心工人掌握全部技术,采用分工的方式,让每个工人分别负责一部分工序或者部分零件的生产,最后进行组装。如此一来,每个工人能够更加专注于特定的任务,从而提高了整体的效率。
分工合作有两个副产品,一个是生产出了可复用的模块,另一个就是模块化方法在工程中的广泛应用,当然也包括计算机科学。
每个零部件不在紧密耦合于特定机器,零件是更加高内聚和低耦合的,从而提高了复用的可能。
而所谓的模块化方法的核心就是:问题分析、模块实现、模块集成,似乎正是脱胎于社会化的分工合作。
回到我们的主题Python编程上,在编程中的模块化思想,将代码的复用,不仅仅局限于某个项目内部。设计、实现良好的模块,更可以应用于后续新的项目中,从而更大程度地提升项目的开发效率。
所以,模块和包,更关键的在于对这种复用思想的理解与践行,实际使用起来,并不复杂。
Python中的模块和包
具体到Python中,其实我们在前面的文章中,已经在反复使用模块了。Python中任何一个Python源文件(.py),都可以是一个模块,都可以作为模块来使用。
在一个Python模块中,可以定义变量、函数、类,也可以导入其他模块。
而Python中的包,可以简单理解为包含一个或者多个模块的目录/文件夹。
所以,可以这样粗糙的理解为,Python中的模块可以等同为一个Python源文件,Python中的包,可以是包含Python源文件的文件夹。
还是以打工人举个例子,这次采用模块化的思想,将围绕打工人的功能放到一个Python文件中,作为一个独立的模块;然后将使用打工人功能的代码放到另一个作为入口文件的Python文件中。
模块代码:dagongren.py
class DaGongRen:
def __init__(self, name, salary=3000):
self.name = name
self.salary = salary
def work(self):
print(f"打工人{self.name}[薪水: {self.salary}]在努力工作")
def jiaxin(team):
for dgr in team:
dgr.salary = round(dgr.salary * 1.1)
print("这是在模块[dagongren]中")
入口文件:main.py
from dagongren import DaGongRen, jiaxin
print('这是在入口文件中')
zs = DaGongRen('张三')
ls = DaGongRen('李四', 4000)
zs.work()
ls.work()
print('涨薪后')
jiaxin([zs, ls])
zs.work()
ls.work()
执行结果:
执行结果中,可以看到在模块dagongren通过import导入时,其中的print()语句也被执行了,然后才是执行main.py中的语句。
执行完成后,会发现代码目录中多了一个__pycache__的目录:
这个目录,我们之前查看字节码时也简单过的,当使用import语句导入模块时,Python解释器会认为模块可能被重复使用,为了提供运行的效率,会将模块代码编译为字节码,再次使用到该模块时,直接使用编译后的字节码文件即可。
模块和包也是对象
文章中,我们一直在反复提及“Python中一切皆对象”,模块和包自然也不例外,也是Python中的对象。
我们可以通过代码来简单验证一下这个结论,直接看代码:
我们首先定义了一个文件夹package_test作为包,然后在文件夹中创建一个module_test.py文件,作为模块,模块中仅有一行代码:
print("这是在模块[module_test]中")
新的入口文件:main_2.py
import package_test
from package_test import module_test
import sys
print(package_test)
print(type(package_test))
print(module_test)
print(type(module_test))
print(sys)
print(type(sys))
# sys.modules保存了当前加载的所有模块,大部分是内置模块,我们自定义的模块在字典的最后
print(sys.modules)
print(sys.modules['package_test'])
print(sys.modules['package_test.module_test'])
目录结构如下:
执行结果如下:
从执行结果中可以得出如下结论:
1、包、自定义的模块、内置模块都是对象,是由module这个类实例化的对象。
2、Python解释器加载的所有模块都会保存在sys.modules这个字典中,key为模块名,value为对应的实例对象。
总结
本文简单介绍了模块化思想的由来,及其在更高级别的代码复用场景中的应用。在Python中模块和包,对应与Python文件及文件夹,而且,模块和包都是对象,是module类的实例化对象。
本文只是简单引入了模块和包的概念,具体的使用细节,在后面的文章中将一一补充说明。
感谢您的拨冗阅读,如果对您学习Python有所帮助,欢迎点赞、关注。