1、包介绍

1.1、什么是包?

 官网解释
Packages are a way of structuring Python’s module namespace by using “dotted module names”
包是一种通过使用‘.模块名’来组织python模块名称空间的方式。(1)具体的:包就是一个包含有__init__.py文件的文件夹,所以其实我们创建包的目的就是为了用文件夹将文件/模块组织起来
(2)需要强调的是:1.在python3中,即使包下没有__init__.py文件,import 包仍然不会报错,而在python2中,包下一定要有该文件,否则import 包报错2.创建包的目的不是为了运行,而是被导入使用,记住,包只是模块的一种形式而已,包的本质就是一种模块

1.2、为何要使用包

 包的本质就是一个文件夹,那么文件夹唯一的功能就是将文件组织起来随着功能越写越多,我们无法将所以功能都放到一个文件中,于是我们使用模块去组织功能,而随着模块越来越多,我们就需要用文件夹将模块文件组织起来,以此来提高程序的结构性和可维护性.

1.3、注意事项

 注意事项:(1)关于包相关的导入语句也分为import和from ... import ...两种,但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:凡是在导入时带点的,点的左边都必须是一个包,否则非法。可以带有一连串的点,如item.subitem.subsubitem,但都必须遵循这个原则。但对于导入后,在使用时就没有这种限制了,点的左边可以是包,模块,函数,类(它们都可以用点的方式调用自己的属性)。(2)import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件(3)包A和包B下有同名模块也不会冲突,如A.a与B.a来自俩个命名空间

2、包的使用

2.1、相对导入与绝对导入

 相对导入与绝对导入(1)绝对导入的格式为 import A.B 或 from A import B,(2)相对导入格式为 from .A import B 或 from ..X import Y,#. 代表当前模块,.. 代表上层模块,... 代表上上层模块,依次类推。

2.2、相对导入对于包的维护优势

 相对导入可以避免硬编码带来的包维护问题,例如我们改了某一层包的名称,那么其它模块对于其子包的所有绝对导入就不能用了,但是采用相对导入语句的模块,就会避免这个问题。

需要注意:存在相对导入语句的模块,是不能直接运行的。

 例如,对于如下层次结构的 Digital.py 文件#!/usr/bin/env python# -*- coding: utf-8 -*-# Purpose: to demo underlayer import upperlayer.##      PHONE#      │  common_util.py   -> setup()#      │  __init__.py#      │#      ├─Fax#      │      G3.py        -> bar()#      │      __init__.py#      │#      ├─Mobile#      │      Analog.py    -> foo()#      │      Digital.py#      │      __init__.py#      │#      ├─Pager#      │      Page.py#      │      __init__.py#      │#      └─Voice#              Isdn.py#              __init__.py#from .Analog import foo          # ValueError: Attempted relative import in non-packagefrom ..common_util import setup  # ValueError: Attempted relative import in non-packagefrom ..Fax.G3 import bar         # ValueError: Attempted relative import in non-package#绝对导入"""from Phone.Mobile.Analog import foofrom Phone.common_util import setupfrom Phone.Fax.G3 import bar"""if __name__ == '__main__':foo()setup()bar()如果上述代码直接运行,将导致 ValueError 异常,ValueError: Attempted relative import in non-package#原因及解决办法:(1)这是因为:一个模块直接运行,Python 认为这个模块就是顶层模块,不存在层次结构,所以找不到其它的相对路径。(2)而要正确运行,就要显式的指定路径

绝对导入对于包维护的劣势

 绝对导入的硬编码模式,如果在包中存在很多 Digital.py 类似模块,都采用了 from Phone.common_util import setup 的语句,如果有一天要更改 common_util 包(文件夹)的名字,那么会影响所有相关的代码。而采用相对导入就没有这个问题.不过,绝对导入更清晰,如果包不是特别复杂,不是特别易变,那么还是建议采用绝对导入。(个人观点,仅供参考)

2.3、包的导入import与from...import

执行文件与示范文件在同级目录下:(1)包的使用之import  单独导入包名称时不会导入包中所有包含的所有子模块(2)包的使用之from ... import ...需要注意的是from后import导入的模块,必须是明确的一个不能带点,否则会有语法错误,如:from a import b.c是错误语法(3)from glance.api import *在讲模块时,我们已经讨论过了从一个模块内导入所有*,此处我们研究从一个包导入所有*。1、可以在包文件下面的__init__中添加需要导入的内容#在glance.__init__.py中from .api.policy import getfrom .api.versions import create_resourcefrom .cmd.manage import mainfrom .db.models import  register_models__all__=['get','create_resource','main','register_models']2、#执行文件中的使用效果如下,请处理好包的导入from glance import *

3、包的应用

3.1、测试一

 在包的使用0 =>>>下面建一个执行文件run.py和longge包文件#调用方式麻烦#原理导入包时做的三件事:1、执行一个文件__init__.py2、产生一个以__init__.py为基准的名称空间3、拿到一个目录longge的名字指向__init__.py#1、longge包文件下面建m1.py && test01文件下面m2.py && test02文件下面m3.py (1)m1.py文件中的:def f1():print('from m1')(2)m2.py文件中的:def f2():print('from m2')(3)m2.py文件中的:def f3():print('from m3')在python3中,即使包下没有__init__.py文件,import 包仍然不会报错,而在python2中,包下一定要有该文件,否则import 包报错#2、执行文件run.py文件from longge import m1from longge.test01 import m2from longge.test02 import m3注意此处要是换成相对导入语句的模块,是不能直接运行的。#from . import m1m1.f1()m2.f2()m3.f3()#执行的结果为from m1from m2from m3

3.2、测试二(绝对导入)

 包文件longge与run.py是在同一个文件夹下面的情况,如何直接使用longge直接对函数进行调用。#1、在包文件中的__init__.py下面添加from longge.m1 import f1from longge.test01.m2 import f2from longge.test02.m3 import f3#2、执行文件run.py文件import longgelongge.f1()longge.f2()longge.f3()import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件#执行的结果为:from m1from m2from m3 #为何不使用绝对导入如果你将包的名字进行修改了,对包进行调用的时候就会导致导入失败。

3.3、测试三(相对导入)

 包文件longge与run.py不在同一个文件夹下面的情况,如何直接使用longge直接进行调用。#0、修改了test02下的m3.py里面的内容from ..m1 import f1  #使用相对路径的方式将f1导入到m3中def f3():f1()print('from m3')#1、在包文件中的__init__.py下面添加(相比测试2,里面的内容不进行修改)from .m1 import f1from .test01.m2 import f2from .test02.m3 import f3#2、执行文件run.py文件中需要添加包文件上一级目录即可import syssys.path.append(r'D:Program FilesTest_pypython-16day01') #将包所在的文件夹加入到环境变量中。import longgelongge.f1()longge.f2() longge.f3()#执行的结果为:from m1from m2from m3

4、总结

绝对导入与相对导入

(1)绝对导入: 以执行文件的sys.path为起始点开始导入,称之为绝对导入优点: 执行文件与被导入的模块中都可以使用缺点: 所有导入都是以sys.path为起始点,导入麻烦(2)相对导入: 参照当前所在文件的文件夹为起始开始查找,称之为相对导入符号: .代表当前所在文件的文件加,..代表上一级文件夹,...代表上一级的上一级文件夹优点: 导入更加简单缺点: 只能在导入包中的模块时才能使用注意:1. 相对导入只能用于包内部模块之间的相互导入,导入者与被导入者都必须存在于一个包内2. attempted relative import beyond top-level package# 试图在顶级包之外使用相对导入是错误的,言外之意,必须在顶级包内使用相对导入,每增加一个.代表跳到上一级文件夹,而上一级不应该超出顶级包

py导入包异常跳出_14-0-包的介绍及使用相关推荐

  1. py导入包异常跳出_马克的Python学习笔记#模块和包

    把模块按层次结构组织成包 模块和包是任何大型项目的核心,就连Python安装程序它本身也是一个包.创建一个软件包结构是非常简单的,我们只要把代码按照我们所希望的方式在文件系统上进行组织并且确保每个目录 ...

  2. py导入包异常跳出_python~异常处理及包

    程序里的异常:"不正常",当python检测一个错误时,解释器无法执行下去,反而出现一个错误的提示. 异常处理:try:可能出现问题的代码 Except:如果出现问题,则执行该代码 ...

  3. py导入包异常跳出_Python:尝试从导入的包导入模块时出现“ModuleNotFoundError”

    您的设置中有几个混淆的要求,但我会尽量满足您的要求. 首先,如果要从man1test.py访问man1.py并从man1.py访问manModules.py,则需要将文件正确设置为packages a ...

  4. py导入包异常跳出_Python运行Unittest作为包导入错误

    I.前言:应用程序的目录结构和模块在文章末尾列出. 二.问题陈述:如果未设置PYTHONPATH,则应用程序运行,但是单元测试失败,并出现ImportError:没有名为models.transact ...

  5. python导入包相当于什么_Python包及其定义和引用详解

    对于一个需要实际应用的模块而言,往往会具有很多程序单元,包括变量.函数和类等,如果将整个模块的所有内容都定义在同一个 Python 源文件中,这个文件将会变得非常庞大,显然并不利于模块化开发. 什么是 ...

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

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

  7. Socket心跳包异常检测的C语言实现,服务器与客户端代码案例

    在Socket心跳机制中,心跳包可以由服务器发送给客户端,也可以由客户端发送给服务器,不过比较起来,前者开销可能较大.本文实现的是由客户端给服务器发送心跳包,服务器不必返回应答包,而是通过判断客户在线 ...

  8. php项目如何导jdbc包,JDBC-idea导入mysql连接java的jar包(mac)的方法

    前言 1.本文使用的是mysql8.0版本 与5.0版本相比:导包方式相同,后面代码中的注册驱动方式不同 1.mac与pc的idea菜单和图标不是完全相同,但是步骤是差不多的 下载对应版本的jar包 ...

  9. 安卓rom包解包linux,[ROM开发]解包打包ROM详细教程 2017.9.8更新安卓7.0

    解包和打包system.img 直接挂载mount system.img /mnt/rom 修改后打包 file_contexts放在当前目录 即打包的img所在目录make_ext4fs -S ./ ...

最新文章

  1. linux java 替换jre_Linux系统 无需JRE配置Java
  2. webserver通信过程
  3. linux分区工具fdisk的使用
  4. 基于SSD的Kafka应用层缓存架构设计与实现
  5. 学习响应式BootStrap来写融职教育网站,Bootsrtap第六天移动端轮播图
  6. (38)FPGA面试题Verilog设计计数器
  7. java api 第一个类是_JAVA之Object常用API
  8. C语言符号意思(看了必懂系列)
  9. 选股公式 成功率测试 软件,通达信股票软件选股公式,99%的成功率,你还等什么?...
  10. CAN、CAN FD
  11. 经纬财富:开封如何炒现货白银
  12. pymol作图-输出PNG格式图片
  13. 免费不限速不限存储的网盘推荐
  14. 个人miniblog被迫备份至此
  15. 在egret中自制帧动画
  16. 研发高频软件,工具,网站,体验飞一般的感觉。
  17. web erp注意问题
  18. python小白到大牛pdf_清华大学出版《python小白到大牛》PDF版分享
  19. 浅谈网络地址转换(NAT)技术与内网、外网
  20. H5企业网站模板:蓝绿过渡色功能菜单齐全企业网站模板

热门文章

  1. flask框架(四):通过局域网访问网站
  2. JavaScript Array 对象(length)方法 (contact、push,pop,join,map、reverse、slice、sort)
  3. Linux的watch命令 -- 实时监测命令的运行结果
  4. 倒数58天 -- 分治法 -- 使用循环求方程的一个解
  5. typescript索引类型_复杂场景下的 typescript 类型锚定 (1) ----- 对象索引提取-阿里云开发者社区...
  6. 初学者python笔记(json模块、pickle模块、xml模块、shelve模块)
  7. C/C++库函数math用法案例篇二
  8. android 9 pie公司,Android 9.0正式推送 定名Android Pie
  9. c语言结构体语法分析,C语言结构体struct的语法解析
  10. Python扩展库numpy中where()函数的三种用法