46、Python之模块和包:一切皆对象,模块和包也不例外

引言

在前面的文章中,我们介绍了变量、函数、类,在实际编程中,始终在贯彻的有两点:

1、在Python中一切皆对象,所以函数、类、模块、包也都是一等公民。

2、不管是基于面向过程还是面向对象,我们在实际编程中所考虑的都是怎么提高代码的复用性,以及如何更加便于扩展。

从变量,到函数,再到类,代码的服用层级是在不断提升的。从本文开始要介绍的模块和包是更高层级的代码的组织与复用形式。

本文会更加偏向于编程的思维及概念,主要内容大致如下:
1、模块化思想

2、Python中的模块和包

3、模块和包也是对象

模块化思想

其实模块化的思想由来已久,从工业革命、社会化大分工开始,就已经在应用模块化思想。

早期的工厂主、资本家,担心工人掌握全部技术,采用分工的方式,让每个工人分别负责一部分工序或者部分零件的生产,最后进行组装。如此一来,每个工人能够更加专注于特定的任务,从而提高了整体的效率。

92d4cdc7bd09c22794ffeb16e436cab8.jpeg

分工合作有两个副产品,一个是生产出了可复用的模块,另一个就是模块化方法在工程中的广泛应用,当然也包括计算机科学。

每个零部件不在紧密耦合于特定机器,零件是更加高内聚和低耦合的,从而提高了复用的可能。

而所谓的模块化方法的核心就是:问题分析、模块实现、模块集成,似乎正是脱胎于社会化的分工合作。

回到我们的主题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()

执行结果:

9ae586a63bd20f8ff353f747b7c0af2f.jpeg

执行结果中,可以看到在模块dagongren通过import导入时,其中的print()语句也被执行了,然后才是执行main.py中的语句。

执行完成后,会发现代码目录中多了一个__pycache__的目录:

63a2d29173194a46430c4b22f261dd1f.jpeg

这个目录,我们之前查看字节码时也简单过的,当使用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'])

目录结构如下:

aa9f4680d30c43d2897deb4639952705.jpeg

执行结果如下:

19102cd9990ad1b6a193db581604f552.jpeg

从执行结果中可以得出如下结论:

1、包、自定义的模块、内置模块都是对象,是由module这个类实例化的对象。

2、Python解释器加载的所有模块都会保存在sys.modules这个字典中,key为模块名,value为对应的实例对象。

总结

本文简单介绍了模块化思想的由来,及其在更高级别的代码复用场景中的应用。在Python中模块和包,对应与Python文件及文件夹,而且,模块和包都是对象,是module类的实例化对象。

本文只是简单引入了模块和包的概念,具体的使用细节,在后面的文章中将一一补充说明。

感谢您的拨冗阅读,如果对您学习Python有所帮助,欢迎点赞、关注。

fe05916848cca7b9ff075cf1724fa9de.jpeg

  • 19
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南宫理的日知录

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值