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

news2024/11/14 13:46:43

引言

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2058141.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用Element UI组件时,icon图标不显示

问题描述: 我在使用Element UI组件的日期选择器时,发现图标不显示(左边是原图,右边的问题图)。 经过检查我发现,我的JS,CSS文件都没有问题,只是缺少了element-icons.tff和element-icons.woff这两个文件。 …

JSON, YAML, XML, CSV交互可视化

1、jsoncrack https://jsoncrack.com/editor

O2OA(翱途)服务器配置与管理-如何修改服务器内存占用率?

o2server 启动后一般占用大约4G~6G内存空间,在启动脚本中默认设置 -Xms2g 限定heap(堆)的大小最小2G,可以通过设置-Xmx来设置堆的上限. Xms -Xms2g:设置JVM初始堆内存为2g.此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存. Xmx -Xmx5g:设置JVM最大堆内存为5g.…

LLM 压缩之二: ShortGPT

0. 资源链接 论文: https://arxiv.org/pdf/2403.03853 项目代码: 待开源 1. 背景动机 现有的大语言模型 LLM 推理存在以下问题: LLM 模型因为 scale law 极大的提高模型的预测能力,但是同样带来较大的推理延时;对于 LLM 应用部署带来较大…

软件设计师全套备考系列文章6 -- 线性表、栈和队列、串、数组、矩阵、广义表

软考-- 软件设计师(6)-- 线性表、栈和队列、串、数组、矩阵、广义表 文章目录 软考-- 软件设计师(6)-- 线性表、栈和队列、串、数组、矩阵、广义表前言一、线性表二、栈和队列三、串、数组、矩阵、广义表 前言 考试时间&#xff…

反向代理:定义与核心作用

反向代理:定义与核心作用 一、反向代理的定义二、反向代理的核心作用 💖The Begin💖点点关注,收藏不迷路💖 反向代理,作为网络架构中的重要组件,扮演着关键角色。本文将简洁介绍反向代理的定义及…

出现 2003 - Can’t connect to MySQL server on ‘xxx‘(10060) 解决方法

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 sql链接远程服务器的时候,出现如下问题: 2003 - Can’t connect to MySQL server on xxx(10060)截图如下所示: 2. 原理分析 错误代码 10060 表示“连接超时”,说明客户端在尝试连接到服务器时,服务器没有响应或者响…

qtsql连接达梦数据库

odbc window和linux都有odbc的中间件,可以通过odbc中间件配合qtsql连接数据库 windows下配置odbc linux配置odbc apt install unixodbc unixodbc-dev /etc/odbcinst.ini配置 [DM8 ODBC DRIVER] DescriptionDM8 ODBC Driver DRIVER/opt/dmdbms/bin/libdodbc.so/et…

LevelDB源码分析(一)安装编译和简单Demo

初识LevelDB 认识LevelDB & 源码下载编译Mac源码下载和编译运行 认识LevelDB & 源码下载编译 LevelDB是 Google 编写的key-value存储库,提供从Key到Value的有序映射。 LevelDB的代码量相比其他开源项目较少,除了测试之外大约有不到两万行代码。 …

LabVIEW软件定制开发公司的前景如何?

LabVIEW软件定制开发公司的前景在当前的技术发展环境下展现出一定的潜力与挑战。这一领域的市场前景主要受到工业自动化、物联网、智能制造等技术趋势的推动,同时也受到行业竞争、技术更新以及人才市场的制约。 ​ 市场需求与增长潜力 随着工业4.0、物联网和智能制…

halcon的HObject被释放

经过简述 某项目由我统一管理HObject(区域和图像)的释放。发现某区域被系统外部所释放。可能有两种情况:a,区域交给我后,释放了。b,获取我的区域后释放了。 最终证明是第二种情况,证明如下: a,…

百度地图SDK Android版开发 7 覆盖物示例1

百度地图SDK Android版开发 7 覆盖物示例1 前言界面布局MapMarker类常量成员变量初始值Marker点击事件Marker拖拽事件创建覆盖物移除覆盖物设置属性 MapMarkerActivity类控件响应事件 运行效果图 前言 文本介绍Marker的常用属性、交互和碰撞示例。 示例功能如下: …

设计模式六大原则(一)–单一职责原则(C#)

文章目录 1. 什么是单一职责原则?2. 单一职责原则的定义3. 单一职责原则的重要性4. 单一职责原则的示例(C#)5.如何判断是否违反单一职责原则6. 单一职责原则的应用场景7. 总结 在软件开发领域,设计模式是解决常见问题的经典解决方…

【实现100个unity特效之24】使用ShaderGraph将图片转变为像素艺术

ShaderGraph连线图 效果 参考 https://www.youtube.com/watch?vBmhj7RgVDzc 完结 赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章…

@DateTimeFormat和@JsonFormat

DateTimeFormat 用于接收前端传入的参数,变成自己想要的格式 JsonFormat用于格式化后端返回给前端的参数 DateTimeFormat(pattern "yyyy-MM-dd HH:mm:ss") JsonFormat(pattern "yyyy-MM-dd HH:mm:ss", timezone "GMT8") private …

深入理解Faiss:高效向量检索的利器

近年来,随着人工智能和机器学习技术的飞速发展,向量检索技术变得越来越重要。无论是在推荐系统、图像搜索还是自然语言处理等领域,向量检索都扮演着至关重要的角色。而在众多向量检索库中,Faiss(Facebook AI Similarit…

-Wl,-rpath= 编译器链接器指定动态库路径 与 LD_LIBRARY_PATH

实例先行, 1,情景 三互相依赖的小项目: (1)libbottom.so,无特别依赖,除系统文件 (2)libtop.so,依赖libbottom.so (3)app 可执行程…

【Deep Live Cam】只需一张图片,就可实现视频的人脸替换。

Deep Live Cam 运用尖端AI技术,将实时换脸和视频深伪推向新的境界。只需一张图片,即可实现高质量的人脸替换。 用户在X上对Deep Live Cam的评价。 如何安装它? 1、环境 python (推荐 3.10 ) pip git ffmpeg https://www.youtube.com…

EmguCV学习笔记 C# 5.3 透视变换

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

WPF如何获取DataGrid的选中行

在DataGrid中加入这一行 <MouseBindingCommand"{Binding OpenWindowCommand}"CommandParameter"{Binding ElementNameNewPlanDataGrid, PathSelectedItem}"Gesture"LeftDoubleClick" /> </DataGrid.InputBindings> 然后ViewModel中…