包的导入

  • 包的概念
  • 包的使用问题
    1. 包结构与__init__.py文件
    1. from XXX import *
    1. 绝对导入与相对导入
  • 包内部的相互导入/python解释器眼中的顶级包

—:包的概念

可以简单的理解为包就是一个包含着__init__.py文件的文件夹,里面包含着多个文件,这些文件中又包含着多个模块,也就是我们的py文件。
随着我们代码量以及功能逐渐的多元化与完善,我们再将全部的模块同一放到一个py文件下显然已经不再合适。因此,我们需要根据模块的功能和属性将其分类,分别存放于不同的文件之中,而我们的包就是将这些文件给包裹起来,对外形成一个统一体。
在python的机制中,为我们提供了一个整合模块与子包(子文件夹)的功能:包


foo就是一个包,里面包含着子包bbb与__init__.py文件,m1,m2,m3就相当于其中的模块。

包的使用

1.包的结构:总的来说包必须包含__init__.py文件,但在python解释器中带有__init__.py文件的文件夹却不一定被视为包。
2.__init__.py文件的作用:导入包的操作其实就是执行包内的__init__.py文件。
总体上每次导入包相当于执行了三件事情1:执行包内的__init__.py文件2:生成一个名称空间用来存放加载__init__.py时产生的名字(变量名,函数名...)3:在导入包的名称空间内产生一个名字(一般为包名),该名字指向第二步产生的名称空间,也就是说导入包只是将__init__.py文件下的名字导入到内存中,并不是将包内所有的模块与子包导入其中。

from XXX import *

相当于将__init__.py文件下的导入所有名字。日常使用中不建议这样使用。一般模块的提供者会用__all__来控制外界用户所能使用的功能。
比如:__all__['m1','m2','m3']

绝对导入与相对导入

1.绝对导入从顶级包开始:from foo.m1 import f12.相对导入**.** 代表当前文件,**.** **.**代表上一级文件,依次类推
如:from . m1 import f1

绝对导入例子:

此时foo作为顶级包,内含有m1~m3模块和子包bbb,
若我们在foo同级目录下的一个文件中调用foo里面的功能,则为:from foo import m1
即从顶级目录下走,一步步一层层的找到我们所需要的的功能函数

相对导入例子

相对导入的优势:

从绝对导入的概念中可以感受到包还是模块的导入方式都可以采用绝对导入来实现的,
那么为何python给我们提供了另一种包的导入方式呢?假设我们开发的包功能越来越多,越来越完善
我们现今的foo包成为了一个子包,那么我们在包内采用的绝对调用方式将会发生整体性的变化。
我们在包内部采用绝对导入的方式由于顶级包发生变化将全部发生改变,而相对导入严格依照**.**,无需顾忌顶级包的变化,仅需在最外层调用进行修改即可

包内部的相互导入

如果我们在foo包内的m2文件中需要用到bbb子包中m4文件中功能时又该怎么办?
法一 : m2文件中绝对导入  from foo.bbb import m4
法二:m2文件中相对导入 from .bbb import m4
但这样不难发现我们无法直接运行m2文件,绝对导入中m2与bbb同一级别,其索引目录里面找不到包foo。存在相对导入的文件无法执行运行。

那么我们如何可以直接运行m2文件又可以在外部调用包的情况下不产生错误呢?

sys内置模块,sys.path里面可以显示我们当前文件执行时的解释器索引目录,绝对导入时因找不到bbb包(执行哪一级下文件只能找到同级目录的文件信息)而产生错误,我们只需要将bbb包的父目录路径添加进索引目录即可
sys.path.append(包foo的绝对路径)

python解释器眼中的包

一般来说,带有__init__.py文件的文件夹都可以视为一个包,但是在python解释器中对顶级包的定义有一些不同。
当我们将main.py作为主函数窗口执行时,此时其父级目录a(尽管含有__init__.py文件)此时将不被视为顶级包
此时在使用相对导入就容易报出超出顶级包这一错误。这也是为什么模块都以一个整体包呈现出来的部分原因,
我们在模块包外部进行导入从而能有效避免包内部相对导入而可能产生的相关错误
总之就是,一般最外层包内的子文件作为调用窗口,则最外层包则被解释器视为寻常文件夹,不能作为整个模块的顶级包使用。

python中包的导入相关推荐

  1. python从包中导入模块_Python中包,模块导入的方法

    Python中包,模块导入的方法 http://www.cnblogs.com/allenblogs/archive/2011/05/24/2055149.html 1. import modname ...

  2. python怎么导入包-如何理解Python中包的引入

    Python的from import *和from import *,它们的功能都是将包引入使用,但是它们是怎么执行的以及为什么使用这种语法呢? 从一模块导入全部功能 from import * me ...

  3. 股票交易接口 Python中安装并导入pandas

    Python中安装并导入pandas 金融市场往往充斥着海量的交易.运行等数据,同花顺iFinD数据接口通过链接iFinD数据库,能够批量获取数据用于分析,在针对资本运作.量化交易的研究中有着广泛的应 ...

  4. Python 模块/包的导入以及 import 的用法总结

    Python 模块/包的导入以及 import 的用法总结 一.模块/包 1. 前言 一个以 .py 为后缀的 Python 文件就是一个模块. 包是一个文件夹或一个目录. 每个包都有一个全局定义的配 ...

  5. python 中关于无法导入自己写的类。解决方法

    python 中关于无法导入自己写的类.解决方法 参考文章: (1)python 中关于无法导入自己写的类.解决方法 (2)https://www.cnblogs.com/jc-home/p/1209 ...

  6. python中根据字符串导入模块module

    python中根据字符串导入模块module 需要导入importlib,使用其中的import_module方法 import importlibmodname = 'datetime'dateti ...

  7. python中文件的导入与导出

    [Python学习]:文件导入与导出 python中文件的导入与导出 文件导入 import pandas as pd df = pd.read_csv('text.txt',sep='\t',enc ...

  8. python如何导入requests模块_浅谈python中requests模块导入的问题

    浅谈python中requests模块导入的问题 今天使用Pycharm来抓取网页图片时候,要导入requests模块,但是在pycharm中import requests 时候报错. 原因: pyt ...

  9. python中使用什么导入模块-Python中使用语句导入模块或包的机制研究

    这篇文章讨论了Python的from import *和from import *,它们怎么执行以及为什么使用这种语法(也许)是一个坏主意. 从一个模块导入全部 from import * means ...

  10. python中包的循环导入_具有继承的包中的循环导入依赖项

    这是一个可怕的Python循环导入参数,但是,IMHO,您可以有一个优秀的设计,仍然需要循环引用.在 所以,试试这个方法: 在东西.py公司名称:class Thing(Base): def acti ...

最新文章

  1. Vue:echarts的柱状图为什么X轴上的文字不显示?
  2. Linux slab 分配器剖析
  3. linux 安装ubuntu-16.04-server-amd64
  4. 利用python爬虫(part11)--XpathHelper为啥不能全信之JS要闹哪般
  5. JAVA那点破事,并发、IO模型、集合、线程池、死锁、非阻塞、AQS...
  6. 熬夜整理出30张可视化大屏模板,不敲一个代码就能直接套用
  7. 三大特征 六大原则结合实践运用
  8. python 小说分析_Python起点小说数据分析
  9. 【金融财经】金融市场一周简报(2018-03-30)
  10. 树莓派开始,玩转Linux4:具备良好的编辑器
  11. 华为出击,智能汽车大蝶变
  12. Tomcat 学习笔记
  13. QT 绘图橡皮擦效果的实现
  14. 你有“隐私泄露担忧”吗?适合普通用户的6个方法来了
  15. DOM之parentNode与offsetParent
  16. 西门子PLC S7-1200和Labview以太网通讯通讯周期20MS
  17. 如何在Nintendo 64控制器上更换磨损的模拟棒
  18. 最新php蓝奏云直链api接口源代码
  19. 从项目管理角度谈OA流程优化
  20. JetBrains公司软件版本控制

热门文章

  1. [精简]托福核心词汇102
  2. 小米手环5表盘bin文件解包修改
  3. 智能建造-钢结构数字应用(附全文PPT)
  4. Axure 制作过滤筛选栏
  5. [史]《全球通史》上册——摘记
  6. 知名清理工具或成恶意软件
  7. Modbus通信协议
  8. 注册表-注册表被禁用如何处理
  9. DB2数据库HANG住的时候应该收集什么数据以及如何处理
  10. 【JAVASCRIPT】-【AES加密解密】01、前端AES加密解密的方式