Python如何优雅的写包——Packages

Python中的函数(Function)、类(Class)、模块(Module)、包库(Package),都是为了实现模块化引用,让程序的组织更清晰有条理。

  • 通常,函数、变量、类存储在被称为模块(Module)的.py文件中,一组模块文件又组成了包(Package)。
  • 将函数、变量、类存储在存储在独立的.py文件中,可隐藏代码实现的细节,将不同代码块重新组织,与主程序分离,简化主程序的逻辑,提高主程序的可读性。
  • 有了包和模块文件,可以在其他不同程序中进行复用,还可以使用其他人开发的第三方依赖库。
  • 便于协同开发,不同人员独立开发各自的包,最后形成项目。

1. Packages官方解释

1.1 包(package)与模块(module)

python 官方对package的解释如下。官方地址:https://docs.python.org/zh-cn/3/tutorial/modules.html#packages

Packages 可以理解为一组模块的包,并用Package.Module的方式来构建命名空间。文件夹中必须有__init__.py 这个文件,才能使 Python 将包含该文件的目录视为包(Package)。

例如,这是一个官方的package例子,提供了关于声音处理的sound包:

sound/                          Top-level package__init__.py               Initialize the sound packageformats/                  Subpackage for file format conversions__init__.pywavread.pywavwrite.pyaiffread.pyaiffwrite.pyauread.pyauwrite.py...effects/                  Subpackage for sound effects__init__.pyecho.pysurround.pyreverse.py...filters/                  Subpackage for filters__init__.pyequalizer.pyvocoder.pykaraoke.py...
  • __init__.py 必须有这个文件,才能使 Python 将包含该文件的目录视为包(Package)。__init__.py可以是一个空文件,也可以执行包的初始化代码或设置__all__变量。__all__指定的是指此包被import * 的时候, 哪些模块会被import进来.
  • formats/ 、effects/ 、filters/ 是次一级的子包(Subpackage),每个子包中也有__init__.py 文件。
  • echo.py等文件是子包中的模块(Module),模块中可能包含函数、类或变量。

引用包(package)中的模块(modules)的示例:

import sound.effects.echo
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)

引用包(package)中子包(submodule)的示例:

from sound.effects import echo
echo.echofilter(input, output, delay=0.7, atten=4)

直接引用包(package)中的函数或变量的示例:

from sound.effects.echo import echofilter
echofilter(input, output, delay=0.7, atten=4)

1.2 使用__all__提供包的显示索引

当我们直接采用from sound.effects import *时,可能会引用一些不需要的内容,或者导致加载速度过慢。 因此import 语句使用以下约定:包的__init__.py代码可以定义了一个名为__all__的列表,来指定用 * 时应导入的模块名称列表。假如sound/effects/__init__.py包含以下代码:

__all__ = ["echo", "surround", "reverse"
]

这意味着from sound.effects import *将会加载这3个字模块。

需要注意的是,子模块可能会被本地定义的函数名遮挡,如果您在sound/effects/__init__.py文件中添加了一个reverse函数,则from sound.effects import *将只导入两个子模块echosurround,而不导入reverse子模块,因为本地定义了reverse函数名:

__all__ = ["echo",      # refers to the 'echo.py' file"surround",  # refers to the 'surround.py' file"reverse",   # !!! refers to the 'reverse' function now !!!
]def reverse(msg: str):  # <-- this name shadows the 'reverse.py' submodulereturn msg[::-1]    #     in the case of a 'from sound.effects import *'

1.3 包内引用

构造成的子包(如示例中的sound包),可以使用绝对导入来引用兄弟包的子模块。例如,如果模块sound.filter.vocoder需要使用sound.effects包中的echo模块,则可以使用 from sound.effects import echo

您还可以使用import语句的from module import name形式相对导入。这些导入使用.来指示相对导入中涉及的当前包和父包。例如,从surround模块中,可以使用:

from . import echo
from .. import formats
from ..filters import equalizer

请注意,相对导入基于当前模块的名称。由于主模块的名称始终为__main__,因此打算用作Python应用程序主模块的模块必须始终使用绝对导入。

2. 示例demo

创建以下目录结构文件:

package-test
|- __init__.py
|- package_1
|-- subpackage_1
|--- __init__.py
|--- module_1.py
|--- module_2.py

module_1.py:

def func_1():print('func_1')

module_2.py:

def func_2():print('func_2')

子包subpackage_1中定义了__init__.py,包含了module_1module_2两个子模块:

from . import module_1
from . import module_2	# 注:每个模块占一行,方便Git代码比对__all__ = ['module_1',		# 注:每个模块占一行,方便Git代码比对'module_2',
]

package_1中定义了__init__.py,包含了subpackage_1子包:

from . import subpackage_1__all__ = ['subpackage_1',
]

主函数main.py可调用pakcage_1包的内容:

from package_1 import subpackage_1if __name__ == '__main__':subpackage_1.module_1.func_1()subpackage_1.module_2.func_2()

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

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

相关文章

【pytorch】深度学习入门一:pytorch的安装与配置(Windows版)

请支持原创&#xff0c;认准DannisTang&#xff08;tangweixuan1995foxmail.com&#xff09; 文章目录 第〇章 阅读前提示第一章 准备工作第一节 Python下载第二节 Python安装第三节 Python配置第四节 Pycharm下载第五节 Pycharm安装第六节 CUDA的安装 第二章 Anaconda安装与配…

Gitee 之初体验(上)

我们在项目开发或者自己学习的时候&#xff0c;总会存在这样的问题&#xff1a; 在一台电脑上编写完代码&#xff0c;想要再另外一台电脑上再去写&#xff0c;再或者和其他人一起协作等等场合&#xff0c;代码传来传去很麻烦。 这个时候&#xff0c;我们就可以去使用代码管理工…

LeetCode刷题---打家劫舍问题

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、打家劫舍 题目链接&#xff1a;打家劫舍 题目描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定…

Spring Security 6.x 系列(7)—— 源码分析之建造者模式

一、建造者模式 WebSecurity、HttpSecurity、AuthenticationManagerBuilder 都是框架中的构建者&#xff0c;把他们放到一起看看他们的共同特点&#xff1a; 查看AuthenticationManagerBuilder的继承结构图&#xff1a; 查看HttpSecurity的继承结构图&#xff1a; 查看WebSec…

在线html地址转html文本

可用于在线协议配置 页面展示 <div v-html"docHtml" />html文本获取 function downloadDoc(url) {// const load this.openInvLoading()let req false// Safari, Firefox, 及其他非微软浏览器if (window.XMLHttpRequest) {try {req new XMLHttpRequest()…

数据结构(超详细讲解!!)第二十六节 图(上)

1.基本概念 图&#xff08;Graph&#xff09;是一种较线性表和树更为复杂的非线性结构。是对结点的前趋和后继个数不加限制的数据结构&#xff0c;用来描述元素之间“多对多”的关系(即结点之间的关系是任意的)。 一个图G &#xff08;V&#xff0c;E&#xff09;由顶点&…

excel 计算断面水质等级

在工作中遇到根据水质监测结果要判断断面等级。写了下面的公式&#xff1a; 因子标准值 limits {COD: [15,15, 20, 15,20],氨氮: [0.15, 0.5, 1, 1.5, 2.0],总磷: [0.02, 0.1, 0.2, 0.3, 0.4] } excel公式&#xff1a; IFS(MAX(IF(M2>20,1,0), IF(N2>2,1,0), IF(O2&g…

RabbitMQ登录控制台显示--你与此网站的连接不是私密连接

一、RabbitMQ默认账号 Note: The default administrator username and password are guest and guest. 注:默认管理员用户名和密码为guest和guest 二、自己修改过或者注册的情况 由于本人之前用过,注册过账号密码,在登录时,用户名账号有异常出现以下问题 解决方案: 因为我的rab…

AI - Steering behaviorsII(碰撞避免,跟随)

Steering Behaviors系统中的碰撞避免&#xff0c;路径跟随&#xff0c;队长跟随 Collision Avoid 在物体前进的方向&#xff0c;延伸一定长度的向量进行检测。相当于物体对前方一定可使范围进行检测障碍物的碰撞 延伸的向量与碰撞物圆心的距离小于碰撞物的半径&#xff0c;则…

计算机体系结构----流水线技术(三)

本文仅供学习&#xff0c;不作任何商业用途&#xff0c;严禁转载。绝大部分资料来自----计算机系统结构教程(第二版)张晨曦等 计算机体系结构----流水线技术&#xff08;三&#xff09; 3.1 流水线的基本概念3.1.1 什么是流水线3.1.2 流水线的分类1. 部件级流水线、处理机级流…

您的计算机已被.Elbie勒索病毒感染?恢复您的数据的方法在这里!

引言&#xff1a; 在数字世界里&#xff0c;.Elbie勒索病毒如同一位隐匿的黑帮成员&#xff0c;以其狡猾而毁灭性的手段频频露面。我们将深入探讨.Elbie的狡诈行径&#xff0c;教你如何在被其加密的数据中找回丢失的珍贵文件&#xff0c;并揭示如何巧妙规避这场数字陷阱。数据…

C语言之结构体详解

C语言之结构体详解 文章目录 C语言之结构体详解1. 结构体类型的声明2. 结构体变量的创建和初始化3. 结构体的特殊声明4. 结构体的自引用结构体的自引用匿名结构体的自引用 5. 结构体内存对齐5.1 练习一5.2 练习三 6. 为什么存在内存对⻬? 1. 结构体类型的声明 struct tag {me…

MySQL电商管理系统练习题及答案

一 、表结构 用户表(user)&#xff1a;id(主键)、username、password、email、phone、age商品表(product)&#xff1a;id(主键)、name、price、stock、description订单表(order)&#xff1a;id(主键)、user_id(外键&#xff0c;关联用户表)、total_price、status、create_time…

05_属性描述符

05_属性描述符 文章目录 05_属性描述符一、属性描述符是什么&#xff1f;二、属性描述符①&#xff1a;查看属性描述②&#xff1a;设置属性描述符③&#xff1a;案例01.代码实现02.代码实现&#xff08;优化&#xff09; 一、属性描述符是什么&#xff1f; 属性描述符的结构 在…

类和对象——(3)再识对象

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 你说那里有你的梦想&#xff0c;…

MySQL官网推荐书籍

MySQL官网推荐书籍 图片有防盗链csdn转存失败。有图版传送门MySQL官网推荐书籍 高效的MySQL性能&#xff1a;Daniel Nichter的最佳实践和技术 Daniel Nichter 向您展示了如何应用直接影响 MySQL 性能的最佳实践和技术。您将学习如何通过分析查询执行、为常见 SQL 子句和表联接…

KMP基础架构

前言 Kotlin可以用来开发全栈, 我们所熟悉的各个端几乎都支持(除了鸿蒙) 而我们要开发好KMP项目需要一个好的基础架构,这样不仅代码更清晰,而且能共享更多的代码 正文 我们可以先将KMP分为前端和服务端 它们两端也能共享一些代码,比如接口声明,bean类,基础工具类等 前端和…

Go语言 值传递

官方说法&#xff0c;Go中只有值传递&#xff0c;没有引用传递 而Go语言中的一些让你觉得它是引用传递的原因&#xff0c;是因为Go语言有值类型和引用类型&#xff0c;但是它们都是值传递。 值类型 有int、float、bool、string、array、sturct等 引用类型有slice&#xff0c…

Logstash使用指南

介绍 Logstash是一个开源数据收集引擎&#xff0c;具有实时管道功能。它可以动态地将来自不同数据源的数据统一起来&#xff0c;并将数据标准化到你所选择的目的地。尽管Logstash的早期目标是搜集日志&#xff0c;现在它的功能已完全不只于此。任何事件类型都可以加入分析&…

docker (镜像分层、阿里云镜像推送/拉去)-day02

一、镜像概念 Docker 镜像是 Docker 容器的基础&#xff0c;它提供了一种可重复使用的、跨平台的部署方式&#xff0c;使得应用程序的部署和运行变得简单和高效。 把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),打包好…