深入理解Python的包机制

【Python】深入理解Python中的装饰器:从零开始编写和应用高效的函数装饰器 装饰器是Python中一种强大的功能,它可以在不改变原始函数代码的情况下为函数添加功能。本文旨在从零开始,引导读者理解装饰器的核心概念,学习如何编写并灵活应用装饰器来增强代码的复用性和可维护性。首先,我们会介绍装饰器的基本语法和工作原理,然后通过实际的应用场景展示装饰器在日志记录、性能分析、权限验证和缓存等方面的广泛用途。通过详细的示例和最佳实践,本文帮助读者掌握如何编写高效的装饰器,从而使代码更加优雅和灵活。 阅读详情

     最近在重构Python代码时,感觉代码只分割到文件有点不够用了,但以前对Python的包机制一直缺乏比较深入的理解,借此机会提升一下,彻底弄清楚Python的包机制,更好组织代码结构。后面逐渐把Python工具箱使用包组织起来。

      Python中的Module是比较重要的概念。常见的情况是,事先写好一个.py文 件,在另一个文件中需要import时,将事先写好的.py文件拷贝 到当前目录,或者是在sys.path中增加事先写好的.py文件所在的目录,然后import。这样的做法,对于少数文件是可行的,但如果程序数目很多,层级很复杂,就很吃力了。

      有没有办法,像Java的Package一样,将多个.py文件组织起来,以便在外部统一调用,和在内部互相调用呢?答案是有的。
主要是用到python的包的概念,python __init__.py在包里起一个比较重要的作用。要弄明白这个问题,首先要知道,python在执行import语句时,到底进行了什么操作,按照python的文档,它执行了如下操作:

  • 第1步,创建一个新的,空的module对象(它可能包含多个module);
  • 第2步,把这个module对象插入sys.module中
  • 第3步,装载module的代码(如果需要,首先必须编译)
  • 第4步,执行新的module中对应的代码。

        在执行第3步时,首先要找到module程序所在的位置,其原理为:

        如果需要导入的module的名字是m1,则解释器必须找到m1.py,它首先在当前目录查找,然后是在环境变量PYTHONPATH中查找。 PYTHONPATH可以视为系统的PATH变量一类的东西,其中包含若干个目录。如果PYTHONPATH没有设定,或者找不到m1.py,则继续搜索 与python的安装设置相关的默认路径,在Unix下,通常是/usr/local/lib/python。
事实上,搜索的顺序是:当前路径 (以及从当前目录指定的sys.path),然后是PYTHONPATH,然后是python的安装设置相关的默认路径。正因为存在这样的顺序,如果当前 路径或PYTHONPATH中存在与标准module同样的module,则会覆盖标准module。也就是说,如果当前目录下存在xml.py,那么执 行import xml时,导入的是当前目录下的module,而不是系统标准的xml。

        了解了这些,我们就可以先构建一个package,以普通module的方式导入,就可以直接访问此package中的各个module了。

      Python中的package定义很简单,其层次结构与程序所在目录的层次结构相同,这一点与Java类似,唯一不同的地方在于,python中的package必须包含一个__init__.py的文件。
例如,我们可以这样组织一个package:

package1/
    __init__.py
    subPack1/
        __init__.py
        module_11.py
        module_12.py
        module_13.py
    subPack2/
        __init__.py
        module_21.py
        module_22.py
……

__init__.py可以为空,只要它存在,就表明此目录应被作为一个package处理。当然,__init__.py中也可以设置相应的内容,下文详细介绍。

好了,现在我们在module_11.py中定义一个函数:

def funA():
     print "funcA in module_11"
     return

在顶层目录(也就是package1所在的目录,当然也参考上面的介绍,将package1放在解释器能够搜索到的地方)运行python:

>>>from package1.subPack1.module_11 import funcA
>>>funcA()
funcA in module_11

这样,我们就按照package的层次关系,正确调用了module_11中的函数。

细心的用户会发现,有时在import语句中会出现通配符*,导入某个module中的所有元素,这是怎么实现的呢?
答案就在__init__.py中。我们在subPack1的__init__.py文件中写

__all__ = ['module_13', 'module_12']

然后进入python
>>>from package1.subPack1 import *
>>>module_11.funcA()
Traceback (most recent call last):
File "", line 1, in 
ImportError: No module named module_11

也就是说,以*导入时,package内的module是受__init__.py限制的。

好了,最后来看看,如何在package内部互相调用。
如果希望调用同一个package中的module,则直接import即可。也就是说,在module_12.py中,可以直接使用
import module_11

如果不在同一个package中,例如我们希望在module_21.py中调用module_11.py中的FuncA,则应该这样:
from module_11包名.module_11 import funcA

包机制
# a.py
def add_func(a,b):
return a+b
# b.py
from a import add_func # Also can be : import a

print ("Import add_func from module a")
print ("Result of 1 plus 2 is: ")
print (add_func(1,2)) # If using "import a" , then here should be "a.add_func"

module可以定义在包里面.Python定义包的方式稍微有点古怪,假设我们有一个parent文件夹,该文件夹有一个child子文件夹.child中有一个module a.py . 如何让Python知道这个文件层次结构?很简单,每个目录都放一个名为_init_.py 的文件.该文件内容可以为空.这个层次结构如下所示:
parent 
--__init_.py
--child
-- __init_.py
--a.py

b.py
那么Python如何找到我们定义的module?在标准包sys中,path属性记录了Python的包路径.你可以将之打印出来:
import sys

print(sys.path)
通常我们可以将module的包路径放到环境变量PYTHONPATH中,该环境变量会自动添加到sys.path属性.另一种方便的方法是编程中直接指定我们的module路径到sys.path 中:
import sys
import os
sys.path.append(os.getcwd()+'\\parent\\child')
print(sys.path)
from a import add_func
print (sys.path)
print ("Import add_func from module a")
print ("Result of 1 plus 2 is: ")
print (add_func(1,2))



知识点:
如何定义模块和包
如何将模块路径添加到系统路径,以便python找到它们
如何得到当前路径

深入理解python装饰器  本文主要是对python的装饰器进行深入的讲解,希望能对学习Python的同学们有所帮助。 文章目录 1. 最初的需求:求调用3次求最大值函数的平均时间 2. 新增需求:求调用3词求最小值函数的平均时间 3. 重复代码分析 4. 重复代码改为函数问题解析 5. 装饰器 6. 装饰器原理 7. 装饰器有参数 8. 内置装饰器 阅读详情

相关推荐

Python教程:深入理解Python元编程

Python元编程是一种高级编程技术,它允许我们在运行时操作程序的结构,如类、函数和模块。这种能力使得Python代码更加灵活和动态,但也带来了一定的复杂性和潜在的风险。本文将深入探讨Python元编程的概念、技术、底层原理以及源码分析,帮助读者更好地理解和应用这一高级特性。

旦莫的博客 1133

python工程项目如何进行包管理

如果有多个依赖包需要安装,可以将它们列在一个文本文件中,每个包占一行,并使用 pip 工具的 requirements 参数进行安装。在 Python 中,可以使用 pip 工具进行包管理,它可以帮助用户安装、更新、卸载包以及显示已安装包的相关信息。以上就是 Python 工程项目如何进行包管理的一些最佳实践。

qq_27487739的博客 1360

Python元组的创建与操作:深入理解

本文深入探讨了Python中元组的创建、操作和管理。通过切片和拼接创建新对象、获取用户输入并转换为元组、以及掌握元组的内置函数和方法,如len()、count()、index()、sorted()、min()和max()等,我们能够更高效地利用Python元组进行数据处理。此外,文章还介绍了元组的打包和解包技术,以及在Python 3中不再可用的cmp()函数。

weixin_42146230的博客 419

python的包管理机制

python导包 python中有module模块,通常我们自定义一个demo.py的文件,在另一个文件需要导入时,将demo.py拷贝到当前目录,或者在sys.path添加demo.py的目录路径,然后导入。文件少的时候还可以,多了就很吃力。 python包的概念 每一个python包里面都有一个__init__.py 文件。python在执行import语句时 进行如下操作: - 1...

浮云 1331

MagicDraw-用例图

MagicDraw-用例图

木头征的博客 3132

基于STM32的便携式心率血氧监测系统 | 保姆式教程 开源可复刻

本项目基于STM32F103C8T6核心控制器,完整实现了便携式心率血氧监测系统的全功能开发,覆盖MAX30102光电传感器驱动、PPG信号处理、心率血氧解算算法、人机交互、数据存储、报警保护、低功耗管理等核心功能,全程采用无跳步保姆式教学,从硬件选型、接线、CubeMX配置、代码开发、调试优化全流程拆解,跟着步骤一步步操作,就能顺利完成项目复刻

ZhongWeiXiang9的博客 768

干货!Python 包的依赖管理,有解了!

之前一直比较抵触用 Python ,很大一部分原因是觉得 Python 项目的环境管理比较混乱。Node.js 有 Npm 包管理工具,通过 package.json 配置项目依赖,最多再通过 nvm 来进行环境切换;Java 有 Maven Gradle 来进行包管理和项目依赖配置,并体现在 pom.xml 和 build.gradle 等中。而 Python 相比编程语言有时更体现了脚本语言的特性,系统化和标准化程度都不太高。很多 Python 项目上来就是怼代码,没有声明依赖、配置环境的文件。

Python栈 1837

petalinux i2c的配置

1.硬件平台配置 1.内核配置 cd petalinux-config -c kernel -> Device Drivers -> I2C support -> i2C Hardware Bus support -> Xilinx I2C Controller Pressing 启用CONFIG_I2C_XILINX=y 2.修改用户设备树 cd cd project-spec/meta-user/recipes-bsp/device-tree/files/ i2c2:

u013403954的博客 4314

探索 Python 包管理:基础篇

在 Python 的世界中,包管理器是提高开发效率和保证代码质量的关键工具。它们不仅极大地简化了代码库的管理,还能高效地处理项目依赖的问题,确保在开发过程更加流畅和稳定。从自动化安装和更新库,到保持项目依赖的一致性,包管理器在每一个环节都发挥着不可替代的作用。本文将深入探讨 Python 包管理器的核心功能和操作方法,揭示它们如何在现代编程实践中提供支持。我们将介绍几种流行的包管理器,包括它们的特点、使用场景以及如何在您的项目中高效利用这些工具。

m0_59236602的博客 1999

高动态范围结构光三维测量技术:从多曝光融合到深度学习的演进与应用

本文深入探讨了高动态范围结构光三维测量技术的演进与应用,从传统的多曝光融合技术到深度学习驱动的创新方案。通过工业案例展示了该技术在提升测量精度和效率方面的显著优势,特别是在处理高反光、复杂表面时的突破性表现。文章还提供了针对不同工业场景的技术选型指南,帮助工程师优化三维测量解决方案。

weixin_29063979的博客 293

第十四节《OpenCascade集成Qt》

将 OpenCascade 与 Qt 集成是开发图形界面应用的常见需求。通过将 OpenCascade 的几何建模与 Qt 的图形用户界面(GUI)功能结合,可以创建强大而灵活的 CAD 或建模工具。OpenCascade 提供了与 Qt 的集成接口,允许你在 Qt 应用程序中嵌入 OpenCascade 的视图,执行几何操作,并与用户进行交互。以下是 OpenCascade 与 Qt 集成的详细步骤:首先,确保已安装 OpenCascade 和 Qt。你可以从 OpenCascade 官方网站或通过包管理

yumeiguo的博客 597

Python包管理与安装机制详解

本文系统介绍了Python包管理的核心机制,从基础概念到实际应用。首先解析了模块、包和发行版的基本概念,对比了源码包和wheel包的特点。然后详细阐述了打包描述文件的演进过程,从传统的setup.py到现代的pyproject.toml标准。接着说明了发行版的构建流程,包括工具安装和构建命令。最后剖析了pip安装的完整流程,包括依赖解析、环境搭建和文件安装等关键步骤。全文循序渐进地揭示了Python包管理背后的原理,帮助开发者深入理解并高效使用Python的包管理系统。

vortex5的博客 2382

Qt Installer Framework 简单使用

qt installer framework 简单使用

qq_42815643的博客 2576

python包管理机制_深入理解Python的包机制

最近在重构Python代码时,感觉代码只分割到文件有点不够用了,但以前对Python的包机制一直缺乏比较深入的理解,借此机会提升一下,彻底弄清楚Python的包机制,更好组织代码结构。后面逐渐把Python工具箱使用包组织起来。Python中的Module是比较重要的概念。常见的情况是,事先写好一个.py文 件,在另一个文件中需要import时,将事先写好的.py文件拷贝 到当前目录,或者是在sy...

weixin_35853254的博客 480

FPGA原型验证(八):SoC设计适配与实现策略

时钟门控在SoC设计中很常见,应该小心处理门控时钟,以成功地在FPGA上原型化SoC设计。现代FPGA综合工具在正确约束的情况下,可以自动处理大多数门控时钟。通过遵循本章中的指导方针,即使具有复杂时钟门控的SoC设计也可以得到处理,并成功地在FPGA上进行原型化。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 478

AI学习指南RAG篇(19)-API调用与集成

通过上述API调用示例,您可以方便地将RAGFlow与其他系统集成,实现数据集管理、文档处理、会话管理等功能。希望本文的介绍能帮助您更好地理解和使用RAGFlow的API。

俞兆鹏的博客 2548

Python之路——Python3 入门教程

Python之路——Python3 入门教程   本文适合有Java编程经验的程序员快速熟悉Python,本文程序在windows xp+python3.1a1测试通过。   本文提到的idle指python shell,即安装python后你在菜单看到的IDLE(python gui),在idle里ctrl+n可以打开一个新窗口,输入源码后ctrl+s可以保存,f5运行程序。

jasonfqw的专栏 743

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

RemakePython

【代码】RemakePython。

qq_55788328的博客 479

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

python入门1

先列一般学习计算机语言之快速入门秘籍 (此处基于linux终端,部分安装不做介绍) 1 python启动 直接python 2 退出 quit() 3 脚本运行 命令:python xx.py 4 变量(数据结构):http://www.yiibai.com/python/python_variable_types.html Python有五个标准的数据类型: 数字 ...

weixin_30551963的博客 76

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

深入理解Python中的闭包(Closure)机制

闭包是指一个函数对象,即使其定义环境已经销毁,仍然保持对外层函数变量的引用。函数内嵌套函数内层函数引用了外层函数的变量外层函数返回内层函数x = 10print(x)fn() # 输出 10这里,inner就是闭包,它“记住”了outer的局部变量x。闭包是函数式编程的利器,掌握它可以写出优雅且高效的代码理解变量捕获和nonlocal,避免常见坑结合装饰器和实际项目案例,深化闭包应用能力通过大量示例和练习,提升代码质量和面试竞争力。

feizuiku0116的博客 775

深入理解 Python 中的函数

函数是一段可重复使用的代码块,用于执行特定任务。通过将常用操作封装成函数,我们可以避免重复编写相同的代码,提升程序的模块化和可维护性。例如,如果你需要多次计算两个数的和,可以将其写成一个函数:print(add(3, 5)) # 输出: 8在 Python 中,使用def关键字来定义函数,其基本语法如下:def 函数名(参数列表):"""文档字符串(可选)"""函数体return 返回值(可选)def:关键字,表示开始定义一个函数。函数名:遵循变量命名规则,通常使用小写字母和下划线(如。

weixin_40266856的博客 1万+

Flit开发者指南:深入源码理解打包机制与扩展开发

Flit是一款简化Python模块打包流程的工具,它通过直观的配置和自动化处理,帮助开发者轻松创建符合Python打包标准的发行版。本指南将深入解析Flit的核心源码结构,揭示其打包机制的实现原理,并提供扩展开发的实用技巧,让你快速掌握这一高效工具的使用与定制方法。 ## 核心功能模块解析 Flit的源码组织结构清晰,主要功能分散在多个核心模块中,每个模块负责特定的打包环节。通过理解这些模块的

gitblog_00013的博客 627

Python中的闭包与装饰器深入理解与应用实践

Python中的闭包机制深度解析闭包是函数式编程中的一个重要概念,在Python中通过嵌套函数实现。当内部函数引用外部函数的局部变量时,即使外部函数已经执行完毕,这些变量的状态仍会被保留,这种结构称为闭包。闭包本质上是一个函数对象,它记住了被定义时的环境状态。一个完整的闭包需要满足三个条件:必须有嵌套函数、内部函数必须引用外部函数变量、外部函数必须返回内部函数。例如:def outer_func(x): def inner_func(y): return x + y return

fxd2006的博客 522

Python教程:超详细1小时学会Python,太简单了!

一个熟练的程序员应该对这些概念相当了解,这样在你挤出宝贵的一小时阅读这篇短短的教程之后,你能够通过已有知识的迁移类比尽快熟悉Python,然后尽快能用它开始编程。Python定义包的方式稍微有点古怪,假设我们有一个parent文件夹,该文件夹有一个child子文件夹,child中有一个module a.py。Python学习了Java的长处,提供了大量极方便易用的标准库供程序员"拿来主义".(这也是Python成功的原因)。该文件内容可以为空。Python的程序能够直接运行,对比Java,这是一个优势。

2401_85428892的博客 450

Python EXE逆向解析终极指南:深度掌握PyInstaller与py2exe解包技术

你是否曾面对一个打包成EXE的Python程序,却无法窥探其内部逻辑?无论是进行安全分析、代码审计还是技术研究,**Python EXE逆向解析**都是现代开发者和安全研究员的必备技能。本文将为你提供一套完整的**Python EXE解包解决方案**,帮助你深入理解并掌握**PyInstaller逆向工程**和**py2exe反编译**的核心技术。 ## 🎯 为什么需要Python EXE逆向

gitblog_00281的博客 872

深入理解Python装饰器:概念、用法与常见场景

我见过太多Python开发者,在装饰器面前止步不前。他们能写出漂亮的列表推导式,能熟练运用生成器,却一碰到符号就头皮发麻。这很可惜,因为。它不该是让人望而生畏的魔法,而是一把可以轻松撬动代码复用、横切关注点、甚至语言本身表达力的杠杆。想象一下,你正在给一个老项目添加性能监控。你打开一个函数,加上计时代码,保存,再打开另一个函数,复制粘贴同样的逻辑。第三次重复时,你开始怀疑人生。。这不是锦上添花,这是从根本上改变了我们组织代码的方式。

qq_35974860的博客 13
上一篇: Python的包管理工具
下一篇: 比树莓派配置好接地气的香蕉派上手初体验
offbye
offbye 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄24年 1309粉丝 252原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

offbye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值