首页 > 编程语言 >46、Python之模块和包:一切皆对象,模块和包也不例外

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

时间:2024-08-21 15:27:46浏览次数:10  
标签:46 module sys Python test 模块 print

引言

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

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

标签:46,module,sys,Python,test,模块,print
From: https://blog.csdn.net/dqrcsc/article/details/141359644

相关文章

  • 《泰拉瑞亚》ntdll.dll错误模块:原因、影响与解决方法
    遇到《泰拉瑞亚》(Terraria)游戏中出现ntdll.dll错误的情况通常意味着游戏在加载或运行过程中遇到了与Windows内核相关的严重问题。ntdll.dll是Windows操作系统的核心库之一,用于提供各种底层服务和功能。当这个DLL文件出现问题时,通常会影响到系统的稳定性和性能。下面将详细解......
  • ast.literal_eval替代eval将字符串形式的表达式解析为 Python 对象
    如果一个字符串表示一个列表,你可以使用Python的ast.literal_eval方法将其转换为真正的列表。ast.literal_eval是一个安全的方法,可以将字符串形式的表达式解析为Python对象。这里是一个例子:importast#字符串形式的列表str_list="[1,2,3,4,5]"#将字符串解析......
  • python lightgbm gpu版本,启动!
    环境Ubuntu20.04.2Python3.8.10Nvidia-smidriver535.104.05cuda12.2torch1.13.1+cu116(torchcuda11.6)步骤>python3-mpipinstall--upgradepip...Installingcollectedpackages:pipSuccessfullyinstalledpip-24.2>pip3installligh......
  • python map/filter/reduce的用法示例
    fromfunctoolsimportreducedeffunc0(a):"""a:可迭代对象的迭代元素将function应用于可迭代对象的对应元素,并返回一个迭代器,其中包含了所有映射后的结果map(function,iterable,...)function:要应用于可迭代对象的函数。iterable:要进行映射......
  • 豆瓣评分8.7!Python pandas创始人亲码的数据分析入门手册!
    在众多解释型语言中,Python最大的特点是拥有一个巨大而活跃的科学计算社区。进入21世纪以来,在行业应用和学术研究中采用python进行科学计算的势头越来越猛。近年来,由于Python有不断改良的库(主要是pandas),使其成为数据处理任务的一大代替方案,结合其在通用编程方面的强大实力,完......
  • 豆瓣评分9.0!Python3网络爬虫开发实战,堪称教学典范!
    今天我们所处的时代是信息化时代,是数据驱动的人工智能时代。在人工智能、物联网时代,万物互联和物理世界的全面数字化使得人工智能可以基于这些数据产生优质的决策,从而对人类的生产生活产生巨大价值。在这个以数据驱动为特征的时代,数据是最基础的。数据既可以通过研发产品获得,......
  • python实现自动化生成pdf报告
    easypdf使用手册1.项目介绍1.1关于1.2easypdf有什么优势1.2easypdf可以用来做什么1.3项目框架1.4项目教程视频2.安装项目环境2.1安装Python32.2在Windows上安装Python32.3在Mac上安装Python32.4在Linux上安装Python32.5在Windows上安装Pycharm2.6在Mac上......
  • C#调用python程序
    //在NuGet中安装pythonnet插件usingPython.Runtime;privatevoidbt_python_Click(objectsender,EventArgse){dynamicdynamic;Stopwatchsw=newStopwatch();sw.Start();Runtime.PythonDLL=Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Loc......
  • 基于python+flask框架的通识课在线选课系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,教育领域正经历着深刻的变革,其中在线教育成为了一个重要的发展方向。通识教育作为高等教育体系中的重要组成部分......
  • 在Vue中的三种不同的模块导出方式:分别暴露、统一暴露和默认暴露。
     一,分别暴露:通过在模块中使用export关键字来分别导出多个变量、函数或组件。例如:test.jsexportconstperson={name:"bruce",age:33}exportfunctiongetPerson(){console.log(11)}在另一个模块中,可以使用解构赋值来导入这些分别暴露的变量、函数或组件:import......