热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

包的基础知识及使用方法

本文介绍了包的基础知识,包是一种模块,本质上是一个文件夹,与普通文件夹的区别在于包含一个init文件。包的作用是从文件夹级别组织代码,提高代码的维护性。当代码抽取到模块中后,如果模块较多,结构仍然混乱,可以使用包来组织代码。创建包的方法是右键新建Python包,使用方式与模块一样,使用import来导入包。init文件的使用是将文件夹变成一个模块的方法,通过执行init文件来导入包。一个包中通常包含多个模块。

  今天学习了包的基础知识:

  一、什么是包:

    包是一种模块 但本质上就是一个文件夹

    与普通文件夹的区别就是其中包含一个init文件

  二、包的作用

    包的作用就是从文件夹级别组织代码

    目的就是为了提高维护性

  三、什么时候应该使用包

    之前我们将代码抽取到模块中 从文件级别组织代码 但是如果模块比较多的情况下 结构依然混乱

    此时我们就需要使用包来组织代码

  四、包的使用

    创建一个包

    右键 new-> python packge

    使用包

      既然包 也是模块 那么使用方式就是一样的 使用import来导入包

    import 包名

  五、init文件的使用

    我们说包也是一种模块 所以内部原理是一样的

    1、创建名称空间

    2、执行模块中的代码

    3、在执行文件中产生名称指向模块名称空间

    但是现在包他是一个文件不是一个py文件那么第二步该怎么执行呢?

    这时候init.py就派上用场了

    在导入包时 实际上执行的就是这个init文件

    好处:

      如此一来我们可以使用init来把一个文件夹变成一个模块 这个模块的种类是包

      通常情况下 一个包中有多个模块 并且这些模块经常会同时被导入使用

      这时候你可以在init中将需要的模块一次性导入 当外界在使用这个包的时候 就无需再挨个导入了

    总结:

      init的作用是初始化包 初始化其实就是将包中需要提供给外界的模块统一导入 打包在一起

      用户导入了包 就能使用所有的功能

    注意:

      init 导入模块文件时 由于是作为模块导入 所以sys.path中并不包含 模块所在目录 所以应该导入时要指定包名

    pack包下的init

    from pack import module

    import pack.module

 

    另外:

      init文件 在Python2中是必须的Python3中可选的 但是建议都要有规范

 

  六、包的嵌套

    定义:包中有包如下

    要使用子包中的内容 方法一致 在子包中的init中导入需要的内容 但是注意 不管是不是子包 都是作为模块导入

    所以sys.path中肯定不包含子包路径 导入时需要从执行文件目录往下找

    subpack包下的 init文件

    import pack.subpack.module4

  七、导入包时的注意事项

    使用import导入模块时  可以加点来访问下一层

    import pack.subpack.module4

    ==注意 点的左边必须是包名==

    我们也可以使用from来导入

    from pack.subpack import module4

    ==注意 import后面的内容不可以包含点 必须是一个明确的名字==

  八、相对导入与绝对导入

    利用上面的例子 我们继续来思考

    很多时候一个包内的模块需要相互调用对方的功能来完成操作

    按照我们之前的导入方式 从执行文件开始一层一层往下找是可以的

    但是一个问题是如果报的层级较多 你的导入语句会很长

    另一个问题 如果我们后期需要修改包的名称 那你需要将每一个导入语句都进行修改

    来看一下例子:

      我们可以使用相对导入的方式来简化书写并提高我们的代码的扩展性

    注意:

    ==相对导入仅能用于模块之间互相导入 不能用于执行文件中==

    常见错误演示

    1、绝对导入时没有从执行文件目录开始

    2、在执行文件中使用相对导入

    3、跳出顶层包

    ValueError:attempted relative import beyond top-level package

    

    

转:https://www.cnblogs.com/xiaocaiyang/p/9780623.html



推荐阅读
  • EasyMock实战指南
    本文介绍了如何使用EasyMock进行单元测试,特别是当测试对象的合作者依赖于外部资源或尚未实现时。通过具体的示例,展示了EasyMock在模拟对象行为方面的强大功能。 ... [详细]
  • RedHat 系统下配置国内 YUM 源以替代官方收费源的方法
    本文详细介绍如何在 RedHat Linux 中安装并配置 YUM 包管理器,并通过使用国内镜像源来解决因未购买官方服务而导致的更新源限制问题。 ... [详细]
  • Barbican 是 OpenStack 社区的核心项目之一,旨在为各种环境下的云服务提供全面的密钥管理解决方案。 ... [详细]
  • 深入解析Android中的SQLite数据库使用
    本文详细介绍了如何在Android应用中使用SQLite数据库进行数据存储。通过自定义类继承SQLiteOpenHelper,实现数据库的创建与版本管理,并提供了具体的学生信息管理示例代码。 ... [详细]
  • 本文探讨如何利用Java反射技术来模拟Webwork框架中的URL解析过程。通过这一实践,读者可以更好地理解Webwork及其后续版本Struts2的工作原理,尤其是它们在MVC架构下的角色。 ... [详细]
  • 本文详细介绍了 Python 中的 with 语句及其背后的上下文管理器机制,从基本概念入手,通过具体示例和原理分析,帮助读者深入理解这一重要的资源管理工具。 ... [详细]
  • Java实现文本到图片转换,支持自动换行、字体自定义及图像优化
    本文详细介绍了如何使用Java实现将文本转换为图片的功能,包括自动换行、自定义字体加载、抗锯齿优化以及图片压缩等技术细节。 ... [详细]
  • 详细指南:使用IntelliJ IDEA构建多模块Maven项目
    本文在前两篇文章的基础上,进一步指导读者如何在IntelliJ IDEA中创建和配置多模块Maven项目。通过详细的步骤说明,帮助读者掌握项目模块化管理的方法。 ... [详细]
  • 本文详细介绍了Java集合框架中的Collection体系,包括集合的基本概念及其与数组的区别。同时,深入探讨了Comparable和Comparator接口的区别,并分析了各种集合类的底层数据结构。最后,提供了如何根据需求选择合适的集合类的指导。 ... [详细]
  • Keras 实战:自编码器入门指南
    本文介绍了使用 Keras 框架实现自编码器的基本方法。自编码器是一种用于无监督学习的神经网络模型,主要功能包括数据降维、特征提取等。通过实际案例,我们将展示如何使用全连接层和卷积层来构建自编码器,并讨论不同维度对重建效果的影响。 ... [详细]
  • Ubuntu GamePack:专为游戏爱好者打造的Linux发行版
    随着Linux系统在游戏领域的应用越来越广泛,许多Linux用户开始寻求在自己的系统上畅玩游戏的方法。UALinux,一家致力于推广GNU/Linux使用的乌克兰公司,推出了基于Ubuntu 16.04的Ubuntu GamePack,旨在为Linux用户提供一个游戏友好型的操作环境。 ... [详细]
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • 本文介绍了如何利用Python编程语言从指定目录中提取文件名,并根据文件扩展名进行筛选,将符合条件的文件名保存至文本文件中。文章适合Python初学者,旨在通过实际案例加深对文件操作和字符串处理的理解。 ... [详细]
  • 本文探讨了如何利用 Python 的 PyPDF2 库在内存中高效地合并多个 PDF 文件,并讨论了相关的内存管理问题及优化策略。 ... [详细]
  • 探讨HTML中的DIV样式难题
    本文深入分析了HTML中常见的DIV样式问题,并提供了有效的解决策略。适合所有对Web前端开发感兴趣的读者。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有