使用Python包组织代码

news2024/11/18 5:34:49

使用Python包(package)组织代码

Python 通过包(package)的方式来组织代码,包是一种特殊的模块(module)。

Python 的包有两种形式,分别是Regular packages 和 namespace packages。

所谓 Regular packages 就是指含有__init__.py的目录,这样的包被其他模块导入的时候,会先执行目录下__init__.py里的代码。Regular packages 可以嵌套,也就是目录下的子目录也可以是一个包。

一、前期准备

假设parent/__init__.py里的代码是:

print('从前有座山,')

假设parent/one/__init__.py里的代码是:

print('山上有座庙,')

假设parent/one/one/__init__.py里的代码是:

print('庙里有个老和尚,')

假设parent/two/__init__.py里的代码是:

print('老和尚说:')

假设parent/three/__init__.py里的代码是:

print('从前有座山,')

按上述所示建立对于的py文件。对应效果如下图所示。

具体文件内容对应如下:

# |-parent:
# |---print('从前有座山,')
# |---one:
# |-------print('山上有座庙,')
# |-------one:
# |-----------print('庙里有个老和尚,')
# |---two:
# |-------print('老和尚说:')
# |---three:
# |-------print('从前有座山,')

二、多种import调用方法

如果一个模块被import过,Python会将导入的模块缓存在sys.modules字典里缓存起来,再次导入的时候不会重新执行导入动作,直接从缓存里取。反之,如果我们从sys.modules里把导入的模块删除,则再次import会再次触发模块导入动作。

先来介绍一下del:python中的del用于删除对应的变量的引用。由于python都是引用,而python有GC机制,所以,del语句作用在变量上,而不是数据对象上。

if __name__ == '__main__':
    a = 1  # 对象 1 被 变量a引用,对象1的引用计数器为1
    b = a  # 对象1 被变量b引用,对象1的引用计数器加1
    c = a  # 1对象1 被变量c引用,对象1的引用计数器加1
    del a  # 删除变量a,解除a对1的引用
    del b  # 删除变量b,解除b对1的引用
    print(c)  # 最终变量c仍然引用1

一句话来说,就是del删除的是变量,而不是数据

实验

if __name__ == '__main__':
    while True:
        import parent.one.one

# 从前有座山,
# 山上有座庙,
# 庙里有个老和尚,

import parent.one.one操作会同时打印三个__init__.py的内容。

if __name__ == '__main__':
    while True:
        import parent.one.one
        import parent.two

# 从前有座山,
# 山上有座庙,
# 庙里有个老和尚,
# 老和尚说:

这是因为Python会将导入的模块缓存在sys.modules字典里缓存起来,再次导入的时候不会重新执行导入动作,直接从缓存里取。所以只有一次打印输出。

if __name__ == '__main__':
    while True:
        import parent.one.one

        del sys.modules['parent.one.one']

# 从前有座山,
# 山上有座庙,
# 庙里有个老和尚,
# 庙里有个老和尚,
# 庙里有个老和尚,
# ...

这是因为在把'parent.one.one'sys.modules里把导入的模块删除,则再次import会再次触发模块导入动作。

所以要实现循环输出对应内容,需要在每一次循环中把导入的模块都一一删除,这样才能循环起来!

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

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

相关文章

Jeston TX1TX2 A100 Ubuntu_1804_ROS 系统清理系统缓冲日志

大家好,我是虎哥,我自己的系统,运行一段时间后,出现了存储空间不足,详细查了一下,发现ROS本身就占用了大量的日志空间,这个当然在编程阶段,通过少加打印的方式来优化,但是…

黑群晖安装记录

老姐公司黑群晖坏了。临危受命,尝试拯救硬盘文件。 看起来黑群晖启动了,但是在管理软件找不到黑群晖IP,尝试了各种方法都不行,放弃老群晖,直接拯救硬盘数据,看官网有HDD迁移模式,直接把硬盘插到…

【GD32F427开发板试用】8. 脉搏监控仪

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:hehung 之前发帖 【GD32F427开发板试用】1. 串口实现scanf输入控制LED 【GD32F427开发板试用】2. RT-Thread标准版移植 【GD32F427开发板试用…

动态内存开辟必看,一篇就能学会贯通

目录 为什么存在动态内存分配 动态内存函数的介绍 1.malloc函数和free函数 2.calloc函数 3.realloc函数 常见的动态内存错误 经典的笔试题 柔性数组 今天来介绍一下动态内存,让我们直入主题!!!!! 为…

【Cocos新手入门】cocos creator 的研发思路和工具操作说明

本篇文章主要讲解cocos creator 的研发思路和工具操作说明 作者:任聪聪 日期:2023年1月29日 研发思路 关于cocos creator 工具说明 首先cocos creator 是一个编辑游戏界面的窗口,省去了我们日常开发游戏时频繁修改参数调整动画、场景的工作…

Siam R-CNN: 通过重检测进行视觉跟踪

Siam R-CNN: 通过重检测进行视觉跟踪Siam R-CNN: Visual Tracking by Re-DetectionContributionsMethodSiam RCNNVideo Hard Example MiningTracklet Dynamic Programming Algorithm实验总结更多Ai资讯:公主号AiCharm Siam R-CNN: Visual Tracking by Re-Detectio…

DMETL5单机版安装使用

DMETL5安装使用 1.创建dm8数据库 使用dm数据库配置助手dbca创建数据库 2.根据dmetl在线文档创建HOTEL模式 DROP USER IF EXISTS HOTEL CASCADE; DROP TABLESPACE IF EXISTS HOTEL; CREATE TABLESPACE HOTEL DATAFILE HOTEL.DBF SIZE 150 AUTOEXTEND ON NEXT 10; CREATE USE…

基于springboot的仓库管理系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

增鑫科技更新招股书,冲刺深交所上市,正邦集团是其主要股东

近日,江西增鑫科技股份有限公司(下称“增鑫科技”)预披露更新招股书,准备在深圳证券交易所主板上市。据贝多财经了解,增鑫科技曾于2022年7月1日递交招股书,此次更新了截至2022年6月30日的财务数据等信息。 …

权威报告!免费解锁IBM最新《2022-2023年Salesforce状态报告》

前不久,IBM发布了2022-2023年Salesforce状态报告,揭示了一些热门趋势,报告显示Salesforce仍然是许多企业客户成功战略的重要力量。 Salesforce状态报告是一项全球性的、数据驱动的调查,主要调查业务战略、投资和发展,同…

Linux常用命令——rpm命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) rpm RPM软件包的管理工具 补充说明 rpm命令是RPM软件包的管理工具。rpm原本是Red Hat Linux发行版专门用来管理Linux各项套件的程序,由于它遵循GPL规则且功能强大方便,因而广受欢迎。逐…

5.2 晶体管的高频等效模型

从晶体管的物理结构出发,考虑发射结和集电结电容的影响,就可以得到在高频信号作用下的物理模型,称为混合 π\pmb{π}π 模型。由于晶体管的混合 πππ 模型与 hhh 参数等效模型在低频信号作用下具有一致性,因此,可用 …

Unity Native Plugin C#和C++互相调用

官方链接 1.DLL的方式&#xff1a; C代码&#xff1a;编译成DLL&#xff0c;导入Unity #pragma once #include <map> #include <string>//导出宏定义 #define _DllExport _declspec(dllexport)//函数指针 typedef void (*NativeCallback)(const char*);extern &…

【28】C语言 | 关于指针练习(2)

目录 10、下列关于二维数组输出 11、下列关输出 12、下列代码输出什么 13、下列代码输出什么 14、下列代码输出什么 15、下列代码输出什么 16、下列代码输出什么 17、下列代码输出什么 18、杨氏矩阵 19、左旋转两个字符 10、下列关于二维数组输出 int main() {int …

文献阅读:Improving Language Understanding by Generative Pre-Training

文献阅读&#xff1a;Improving Language Understanding by Generative Pre-Training 1. 文章简介2. 模型介绍3. 实验考察 1. 训练数据2. 实验结果3. 消解实验 4. 总结 & 思考 文献链接&#xff1a;https://cdn.openai.com/research-covers/language-unsupervised/languag…

P1464 Function————C++

文章目录题目Function题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1解题思路Code运行结果题目 Function 题目描述 对于一个递归函数 w(a,b,c)w(a,b,c)w(a,b,c) 如果 a≤0a \le 0a≤0 或 b≤0b \le 0b≤0 或 c≤0c \le 0c≤0 就返回值$ 1$。如果 a>20a>20a&…

【Java】-【并发】

文章目录堆和方法区中的数据是可以被共享的堆中的数据是被栈中的变量所持用的&#xff0c;栈是线程隔离的&#xff0c;每个线程私有一个栈&#xff0c;所以栈中的数据不共享调用a方法时&#xff0c;jvm会给a方法创建一块内存区&#xff0c;让其入栈&#xff0c;这块区域被称为a…

linux(信号量)

信号量几个基本概念临界资源临界区原子性互斥信号量后台进程前台进程信号储存信号处理信号(信号捕捉)发送信号1、键盘产生&#xff1a;2、系统调用接口发送信号3、由软件条件产生信号4、硬件异常发送信号内核中的信号量**信号量在内核中的数据结构****信号集操作函数**信号的检…

YOLOv7 Falsk Web 监测平台 | YOLOv7 Falsk Web 部署

YOLOv7 Falsk Web 监测平台图片效果展示 YOLOv7 Falsk Web 监测平台视频效果展示 YOLOv7 Flask Web 检测平台 什么是Flask? 简介 Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活、轻便、安全且容易上手。它可以很好地结合MVC模式进行开发,开…

电子技术——MOS管的小信号模型

电子技术——MOS管的小信号模型 在上一节&#xff0c;我们已经学习过了MOS管的基本线性放大原理&#xff0c;本节我们继续深入MOS管的小信号放大&#xff0c;建立MOS管的小信号模型。 我们本节继续使用上节的电路&#xff0c;如下图所示&#xff1a; DC偏置点 根据上节的知识…