python全栈学习记录(十六)模块与包

news2024/9/27 8:07:41

模块与包

文章目录

  • 模块与包
  • 一、模块
    • 1.模块的导入方式
    • 2.模块的循环导入问题
    • 3.搜索路径与优先级
  • 二、包
    • 1.包的使用
    • 2.绝对导入与相对导入
  • 三、一般工程的开发目录规范

一、模块

模块是一系列功能的集合体,常见的模块形式(自定义模块、第三方模块、内置模块):

  • 一个module.py文件就是一个模块,文件名是module.py,而模块名是module
  • 一个包含有__init__.py文件的文件夹也是模块
  • 已被编译为共享库或DLL的C或C++扩展
  • 使用C编写并链接到python解释器的内置模块

为什么要使用模块?

  • 用第三方或者内置的模块可以极大地提升开发效率
  • 自定义模块即将我们自己程序中需要用到的公共的功能写入一个python文件,然后程序的各部分组件可以通过导入的方式来引用/重用自定义模块中的功能

1.模块的导入方式

import 模块名
from 模块名 import 具体的功能
对于导入的模块,也可以为它起一个别名:
import 模块名 as 自定义名字
from 模块名 import 具体的功能 as 自定义名字

#a.py
def add(x,y):
	return x+y
#b.py
import a
print(a.add(1,2))
<<<3

from a import add
print(add(1,2))
<<<3

from a import add as d
print(d(1,2))
<<<3

导入模块时,解释器会干两件事情:

  • 执行导入模块的代码(重复导入模块只有第一次导入时会执行模块代码)
  • 产生一个名称空间存放产生的变量

由于是将产生的变量名存放在模块的名称空间中,所以使用时必须是模块名.变量的形式,例如上方代码中import a以后使用a中的add要写为a.add。

from 模块名 import 具体的功能时,解释器会将模块中的变量直接导入当前的名称空间中,若是当前名称空间中存在与导入功能重名的变量,后导入的变量会将之前的变量覆盖。

from 模块名 import * 表示导入某个模块中所有功能(该功能无法在函数内部调用)
模块的编写者可以在模块中定义__all__来控制*表达的意思。

#a.py
__all__=['get']
def add(x,y):
	return x+y
get=9
#b.py
from a import *
#由于a的__all__中指定了'get',所以*只会导入get变量,而add不会被导入
print(get)
<<<9
print(add)
<<<NameError: name 'add' is not defined

2.模块的循环导入问题

#n.py
print('n')
from m import y
x=1
#m.py
print('m')
from n import x
y=2
<<<m
<<<n
<<<m
<<<ImportError: cannot import name 'x' from partially initialized module 'n'

执行m.py文件会先打印m,然后开始导入n模块,运行n模块的代码。在n模块的代码中打印n,并导入m模块,运行m模块的代码。再次运行m模块的代码时打印m,由于此前已经运行过n的代码了,所以此次之行m模块的代码不会在运行n模块的代码,而from n import x又要去导入x变量,目前的名称空间不存在x变量,最后报错。
为了避免上述导入时可能产生的问题,设计程序时应尽量避免循环/嵌套导入,如果多个模块需要共用某些数据,可以将数据存入单独的一个模块以供其他模块导入。

3.搜索路径与优先级

导入模块时查找模块的顺序是:

  1. 先从内存中已经导入的模块中寻找
  2. 内置的模块
  3. sys.path中找(sys.path的第一个值是当前执行文件的所在的文件夹)

当需要导入的模块不在sys.path列表中时,需要将路径添加到sys.path中。

二、包

包是模块的一种形式,包的本质就是一个含有__init__.py文件的文件夹。(python3中包即使没有__init__.py文件,直接导入包也不会报错)
在这里插入图片描述

1.包的使用

包内部的模块是用来被导入使用的,而不是被直接执行的。首次导入包时解释器会干两件事:

  1. 执行__init__.py文件
  2. 产生新的名称空间存放运行__init__.py时产生的变量
    使用包时,可以直接包.功能名。例如上方的图片中import core后使用包中的buy函数有直接core.buy。

2.绝对导入与相对导入

python文件一般有两种用途:坐为执行文件、作为模块导入
在这里插入图片描述
如上图中所示,如果run.py表示执行文件,现在需要从setting.py中导入a变量,可以写为

import sys
sys.path.append('atm+购物车文件的绝对路径')
from conf.setting import a

这种导入方式称为绝对导入,也就是以顶级包(atm+购物车文件的绝对路径)为起始开始导入模块。
注意点:

  • 绝对导入可以用于执行文件和模块文件
  • 绝对导入时.左侧必须为文件/包
  • 绝对导入以sys.path中的路径为基准(也就是说sys.path中必须包含atm+购物车文件的绝对路径)

如果现在需要在__init__.py中导入包定义的变量名(init.py文件一般用于存放包中定义的对象名称),如shopping中的buy函数,可以这样导入:

from .shopping import buy

这种调用方式称为相对导入
注意点:

  • 相对导入只能用于模块文件中
  • 相对导入左侧的.必须写,表示当前模块所在的目录(core)。若在相对导入中需要导入上一级目录的模块,可以使用两个.表示

三、一般工程的开发目录规范

在主目录下存放执行文件start.py、readme.md(工程的相关说明)、requirements.txt(工程依赖的python第三方模块)
在conf文件夹中存放配置文件setting.py
在lib文件夹中存放常用的模块commen.py
在core文件夹中存放核心的代码
在api文件夹下存放接口文件
在db文件夹下存放数据相关的代码
在log文件夹中存放日志相关的代码

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

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

相关文章

重头开始嵌入式第四十三天(硬件 ARM架构 汇编语言)

目录 ARM架构补充 一&#xff0c;程序状态寄存器 二&#xff0c;处理器工作模式 三&#xff0c;异常处理 四&#xff0c;指令流水线 汇编语言 一&#xff0c;什么是汇编 二&#xff0c;汇编怎么编 三&#xff0c;ARM汇编指令集 四&#xff0c;数据处理指令 五&#…

DC00019基于java swing+sqlserver超市商品信息管理系统java项目GUI商品信息管理系统

1、项目功能演示 DC00019基于java swingsqlserver超市商品信息管理系统java项目GUI商品信息管理系统 2、项目功能描述 基于java swingsqlserver超市管理系统功能 1、系统登录 2、员工管理&#xff1a;添加员工、查询员工、所有员工 3、部门管理&#xff1a;添加部门、查询部门…

数据结构 ——— 移除元素(快慢指针)

目录 题目要求 代码实现&#xff08;快慢指针&#xff09; 题目要求 编写函数&#xff0c;给你一个数组 nums 和一个值 val&#xff0c;你需要在 nums 数组 原地 移除所有数值等于 val 的元素&#xff0c;并且返回移除后数组的新长度 不能使用额外的数组空间&#xff0c;要…

SSM的学习(3)

项目的结构: 如下图所示。 对SqlMapConfig.xml的分析&#xff1a; 是主要的配置文件。里面写的是 数据的配置 1:引入jdbc.properties 这个里面写的是 账号和密码等信息&#xff0c;不在写在xml里面了&#xff0c;防止写死! 用的是<properties resource "这个外部…

将图片资源保存到服务器的盘符中

服务类 系统盘符&#xff1a;file-path.disk&#xff08;可能会变&#xff0c;配置配置文件dev中&#xff09;文件根路径&#xff1a;file-path.root-path&#xff08;可能会变&#xff0c;配置配置文件dev中&#xff09;http协议的Nginx的映射前缀&#xff1a;PrefixConstant.…

__问题——解决CLion开发Linux驱动时显示头文件缺失

问题描述&#xff1a; 在使用CLion开发Linux驱动时&#xff0c;需要引入各种头文件&#xff0c;比如<linux/module>、<linux/init>等&#xff0c;但是毫无例外&#xff0c;都会在报错提示文件或文件路径不存在。这在很大程度上限制了CLion的发挥&#xff0c;因为无…

【linux】gdb

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;linux笔记仓 目录 01.gdb使用 01.gdb使用 程序的发布方式有两种&#xff0c;debug模式和release模式Linux gcc/g出来的二进制程序&#xff0c;默认是release模式要使用gdb调试&#xff0c;必须在源…

c语言200例 063 信息查询

大家好&#xff0c;欢迎来到无限大的频道。 今天给大家带来的是c语言200例 题目要求&#xff1a; 从键盘当中输入姓名和电话号&#xff0c;以“#”结束&#xff0c;编程实现输入姓名、查询电话号的功能。 参考代码如下&#xff1a; #include <stdio.h> #include <st…

1.6 判定表

欢迎大家订阅【软件测试】 专栏&#xff0c;开启你的软件测试学习之旅&#xff01; 文章目录 1 基本概念1.1 作用1.2 优点 2 基本组成2.1 条件桩2.2 动作桩2.3 条件项2.4 动作项 3 判定表的结构与规则3.1 规则的生成3.2 动作结果3.3 判定表简化 4 判定表的使用场景4.1 软件测试…

什么是Node.js?

为什么JavaScript可以在浏览器中被执行&#xff1f; 在浏览器中我们加载了一些待执行JS代码&#xff0c;这些字符串要当中一个代码去执行&#xff0c;是因为浏览器中有JavaScript的解析引擎&#xff0c;它的存在我们的代码才能被执行。 不同的浏览器使用不同的javaScript解析引…

Linux 文件目录结构(详细)

一、基本介绍 Linux的文件系统是采用级层式的树状目录结构&#xff0c;在此结构中的最上层是根目录“/”&#xff0c;然后在此目录下再创建其他的目录。 Linux世界中&#xff0c;一切皆文件&#xff01; 二、相关目录 /bin[常用](/usr/bin、/usr/local/bin) 是Binary的缩写,…

RabbitMQ常用管理命令及管理后台

RabbitMQ管理命令 1、用户管理1.1、新增一个用户1.2、查看当前用户列表1.3、设置用户角色1.4、设置用户权限1.5、查看用户权限 2、RabbitMQ的web管理后台2.1、查看rabbitmq 的插件列表2.2、启用插件2.3、禁用插件2.4、访问RabbitMQ的web后台2.4、通过web页面新建虚拟主机 ./rab…

LLM - 使用 vLLM 部署 Qwen2-VL 多模态大模型 (配置 FlashAttention) 教程

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/142528967 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 vLLM 用…

虚拟机开启网络代理设置,利用主机代理访问国外资源

前言 有时候需要访问一些镜像网站拉取安装包或是学习资料&#xff0c;由于国内外网络环境差异和网络安全的问题&#xff0c;总会被阻拦。下文来说一下虚拟机centos7如何通过连接主机的代理软件。 一、代理软件设置 1、前提是主机要安装有代理软件&#xff0c;查看代理软件的…

LabVIEW提高开发效率技巧----并行处理

在LabVIEW开发中&#xff0c;充分利用并行处理能力可以显著提高程序的执行效率和响应速度。LabVIEW的图形化编程模型天然支持并行任务的执行&#xff0c;可以通过以下几种方式优化程序性能。 1. 并行For循环&#xff08;Parallel For Loop&#xff09; 对于能够独立执行的任务…

开源鸿蒙OpenHarmony系统更换开机Logo方法,瑞芯微RK3566鸿蒙开发板

本文适用于开源鸿蒙OpenHarmony系统更换开机Logo&#xff0c;本次使用的是触觉智能的Purple Pi OH鸿蒙开源主板&#xff0c;搭载了瑞芯微RK3566芯片&#xff0c;类树莓派设计&#xff0c;是Laval官方社区主荐的一款鸿蒙开发主板。 介绍 OpenHarmony的品牌标志、版本信息、项目…

RabbitMQ 高级特性——重试机制

文章目录 前言重试机制配置文件设置生命交换机、队列和绑定关系生产者发送消息消费消息 前言 前面我们学习了 RabbitMQ 保证消息传递可靠性的机制——消息确认、持久化和发送发确认&#xff0c;那么对于消息确认和发送方确认&#xff0c;如果接收方没有收到消息&#xff0c;那…

每日一题:⻓度最⼩的⼦数组

文章目录 一、题目二、解析1、暴力算法&#xff08;1&#xff09;纯暴力&#xff08;2&#xff09;前缀和 循环 2、滑动窗口 一、题目 209. 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组…

Java项目实战II基于Java+Spring Boot+MySQL的IT技术交流和分享平台的设计与实现(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在当今信息…

归并排序,外排序,计数排序(非比较排序)

归并排序&#xff1a;&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子序列有序…