一、 包导入与模块导入的关系

由于包本质上是模块,其实对模块的许多导入方法都适用于包,但由于包的结构与模块有差异,所以二者还是有些区别的:

  1. 对包的导入,实际上就是包目录下的__init__.py文件的导入,因此凡是在__init__.py定义的成员都会按模块导入的方式执行导入,导入成员的访问方式;
  2. 包导入是可以在__init__.py执行包下模块或子包的导入。

二、 包导入方法及导入案例

包导入方法包括导入包本身、导入包下指定模块、导入包下模块的指定成员,由于包本质上也是模块,实际上这些方法都是与模块导入方法相同或类似。下面列的例子都是以《第10.7节 Python包的定义步骤》中规划的包为基础的。

本节的案例都是基于《第10.7节 Python包的定义步骤》的例子程序来介绍的,在本节就不重复粘贴相关源代码了。

  1. 直接导入包

    1)语法:import 包名

    2)说明:

    i. 如果__init__.py未执行包下模块的导入,也没有包含相关属性的定义,则包的导入基本没有意义;

    ii. 如果__init__.py执行了包下的模块导入,就可以访问导入的包下模块成员,具体访问方式要看模块的导入方式;

    iii. 如果__init__.py执行了其他的属性定义语句,则符合《第10.4节 Python模块的弱封装机制》《第10.5节 使用__all__定义Python模块导入白名单》允许导入的属性可以导入,导入后通过“包名.属性名”访问这些属性。

    3)案例:

    导入《第10.7节 Python包的定义步骤》规划的包goodspricequery:
>>> import goodspricequery
Start loading packeg:goodspricequery ...
Package goodspricequery loaded!Press Enter to exit.
>>> [m for m in dir(goodspricequery) if not m.startswith('_')]
['dataaccessloaded', 'goodspricequeryloaded']
>>> goodspricequery.dataaccessloaded
False

可以看到,导入包实际执行的是包下的__init__.py文件,可以看到包的__init__.py文件定义的两个成员dataaccessloaded、goodspricequeryloaded。

2. 直接导入包之后将包另外命名:

1)语法:import 包名 as 包别名

2)说明:本质上与“import 包名”一致,只是对包内属性的访问时,在“import 包名”中需要使用“包名.”访问的改成需要使用“别名.”访问;

3)案例:

>>> import goodspricequery as gs
Start loading packeg:goodspricequery ...
Package goodspricequery loaded!Press Enter to exit.
>>> [m for m in dir(gs) if not m.startswith('_')]
['dataaccessloaded', 'goodspricequeryloaded']
>>> gs.dataaccessloaded
False
>>>
  1. 导入包中所有允许导入的成员

    1)语法:from 包名 import *

    2)说明:本质上与“from 模块名 import *”类似,只是导入包是导入包下的__init__.py文件,而导入模块是导入指定的文件名;

    3)案例:
>>> from goodspricequery import *
Start loading packeg:goodspricequery ...
Package goodspricequery loaded!Press Enter to exit.
>>> [m for m in dir() if not m.startswith('_')]
['dataaccessloaded', 'goodspricequeryloaded']

可以看到包的成员被导入当前解释器的名字空间。

  1. 导入包中的模块

    1)语法:import包名.模块名1,…,包名.模块名n

    2)说明:

    i. 导入后要访问包的模块成员采用“包名.模块名.成员名”访问;

    ii. 导入模块之前,会先触发包下的__init__.py文件执行。

    3)案例:
>>> import goodspricequery.mainwin
Start loading packeg:goodspricequery ...
Package goodspricequery loaded!Press Enter to exit.
Module:mainwin start load...
Module:mainwin loaded.
>>> [m for m in dir() if not m.startswith('_')]
['goodspricequery']
>>> goodspricequery.mainwin.mainwin()
I'm mainwin
>>>

可以看到先执行goodspricequery包下的__init__.py文件,后执行的模块加载,导入后本地名字空间中多了包名,访问模块的成员采用。

5. 导入包中的模块后将模块另外命名

1)语法:import包名.模块名 as 别名

2)说明:导入后要访问包的模块成员采用“别名.成员名”访问,其他逻辑与“import包名.模块名”相同;

3)案例:

>>> import goodspricequery.mainwin as mw
Start loading packeg:goodspricequery ...
Package goodspricequery loaded!Press Enter to exit.
Module:mainwin start load...
Module:mainwin loaded.
>>> [m for m in dir() if not m.startswith('_')]
['mw']
>>> mw.mainwin()
I'm mainwin
>>>
  1. 从包中导入模块

    1)语法:from 包名import 模块名

    2)说明:导入后要访问包的模块成员采用“模块名.成员名”访问,与“import包名.模块名”的区别是访问时无需带包名

    3)案例
>>> from goodspricequery import mainwin
Start loading packeg:goodspricequery ...
Package goodspricequery loaded!Press Enter to exit.
Module:mainwin start load...
Module:mainwin loaded.
>>> mainwin.mainwin()
I'm mainwin
>>>
  1. 从包中导入模块并将模块另外命名

    1)语法:from 包名import 模块名 as 模块别名;

    2)说明:导入后要访问包的模块成员采用“别名.成员名”访问;

    3)案例:
>>> from goodspricequery import mainwin as mw
Start loading packeg:goodspricequery ...
Package goodspricequery loaded!Press Enter to exit.
Module:mainwin start load...
Module:mainwin loaded.
>>> mw.mainwin()
I'm mainwin
>>>
  1. 从包中指定模块导入成员

    1)语法:from 包名.模块名 import *

    2)说明:导入包指定模块所有允许导入的成员,此时成员的访问无需带包名和模块名,直接通过成员名进行访问,此种方式与模块对应的导入方式类似,只是导入时模块名前多了”包名.”

    3)案例
>>> from goodspricequery.mainwin import  *
Start loading packeg:goodspricequery ...
Package goodspricequery loaded!Press Enter to exit.
Module:mainwin start load...
Module:mainwin loaded.
>>> mainwin()
I'm mainwin
>>>
  1. from包名.模块名import 成员1,…,成员n,导入包下模块的多个成员,此种方式与模块对应导入方法类似,只是导入时模块名前多了”包名.”,在此不展开细说;

  2. from包名.模块名import 成员 as 成员别名,给包下模块导入的成员起一个别名。此种方式与模块对应导入方法类似,只是导入时模块名前多了”包名.”,在此不展开细说。

    案例如下:

>>> from goodspricequery.mainwin import  mainwin as mw
Start loading packeg:goodspricequery ...
Package goodspricequery loaded!Press Enter to exit.
Module:mainwin start load...
Module:mainwin loaded.
>>> mw()
I'm mainwin
>>>

以上包导入方法,除了供外部应用调用导入外,方法4-10也可以在包的__init__.py文件中调用,调用方式和执行结果与外部应用调用基本相同,但__init__.py已经在加载包时先执行,不会再触发__init__.py的再次执行。

注意:除了“import 包名”会显示的导入包加载包的__init__.py文件外,其他方式导入包内的任何模块、子包都会触发包本身的导入,即加载包的__init__.py文件,并且是先执行__init__.py,再按顺序执行对应的其他组件的加载。

本节详细的介绍了包的导入,可以看到包的导入首先是导入包的__init__.py文件,同时还可以根据不同导入方式执行其他的操作如导入包下的模块。

老猿Python,跟老猿学Python!

博客地址:https://blog.csdn.net/LaoYuanPython


请大家多多支持,点赞、评论和加关注!谢谢!

第10.8节 Python包的导入方式详解的更多相关文章

  1. Python包模块化调用方式详解

    Python包模块化调用方式详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一般来说,编程语言中,库.包.模块是同一种概念,是代码组织方式. Python中只有一种模块对象类型 ...

  2. 第10.7节 Python包和子包的定义步骤

    一. 包的定义步骤 按照包名创建或使用一个已有目录,目录名就是包名,必须注意包的目录必须位于Python加载模块的搜索路径中(具体请参考<第10.1节 Python的模块及模块导入>关于模 ...

  3. 第10.6节 Python包的概念

    一. 引言 在<第10.2节 Python的模块及模块导入>介绍了模块的概念及导入的几个关键点,Python中的模块是一个单个的py文件,当我们开发的项目或功能集由多个文件构成时,我们需要 ...

  4. Python包管理工具setuptools详解及entry point

    1.什么是setuptools? setuptools是Python distutils增强版的集合,它可以帮助我们更简单的创建和分发Python包,尤其是拥有依赖关系的.用户在使用setuptool ...

  5. 第10.9节 Python子包的导入方式介绍

    在<第10.8节 Python包的导入方式详解>详细介绍了包的导入方式,子包也是包,子包的导入与包的导入方法上没有本质区别,但二者还是有所不同.本节对照二者的方式介绍子包与包导入的关系: ...

  6. 第7.14节 Python类中的实例方法详析

    第7.14节 Python类中的实例方法详析 一.    实例方法的定义 在本章前面章节已经介绍了类的实例方法,实例方法的定义有三种方式: 1.    类体中定义实例方法 第一种方式很简单,就是在类体 ...

  7. Python安装、配置图文详解(转载)

    Python安装.配置图文详解 目录: 一. Python简介 二. 安装python 1. 在windows下安装 2. 在Linux下安装 三. 在windows下配置python集成开发环境(I ...

  8. 【和我一起学python吧】Python安装、配置图文详解

     Python安装.配置图文详解 目录: 一. Python简介 二. 安装python 1. 在windows下安装 2. 在Linux下安装 三. 在windows下配置python集成开发环境( ...

  9. Python中的高级数据结构详解

    这篇文章主要介绍了Python中的高级数据结构详解,本文讲解了Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint这些数据结构的用法,需要的朋友可以参考 ...

随机推荐

  1. CSS总结(一)

    1 css常用的一些属性 color: 文字颜色(前景色) font-size: 文字大小 font-family: 字体,比如:微软雅黑, 黑体,宋体,仿宋体,"Times New Rom ...

  2. python详细图像仿射变换讲解

    仿射变换简介 什么是放射变换 图像上的仿射变换, 其实就是图片中的一个像素点,通过某种变换,移动到另外一个地方. 从数学上来讲, 就是一个向量空间进行一次线形变换并加上平移向量, 从而变换到另外一个向 ...

  3. TextView之富文本

    项目中使用富文本比较常见了,一行显示多种样式颜色的文本,使用 ClickableSpan 富文本实现在同一个 TextView 中的文本的颜色.大小.背景色等属性的多样化和个性化. 我们也可以使用Ht ...

  4. 同步FIFO学习笔记

  5. python之深浅copy与id

    我们都知道 所谓变量就是就是在空间中开辟一块内存空间.来存放东西的 学过c语言的都知道而数组也是有内存地址的 我们如何来查看内存地址呢?id()这函数就来了 x = 5 print(id(x)) 如此 ...

  6. ceph erasure默认的min_size分析

    引言 最近接触了两个集群都使用到了erasure code,一个集群是hammer版本的,一个环境是luminous版本的,两个环境都出现了incomplete,触发的原因有类似的地方,都是有osd的 ...

  7. Oracle 集合类型

    集合类型 1. 使用条件: a. 单行单列的数据,使用标量变量 .    b. 单行多列数据,使用记录 [ 详细讲解请见: 点击打开链接 ]   c. 单列多行数据,使用集合 *集合:类似于编程语言中 ...

  8. [i春秋]“百度杯”CTF比赛 十月场-Hash

    前言 涉及知识点:反序列化.代码执行.命令执行 题目来自:i春秋 hash  如果i春秋题目有问题可以登录榆林学院信息安全协会CTF平台使用 或者利用本文章提供的源码自主复现 [i春秋]"百 ...

  9. tp5 跨域问题

    只需要三行代码,写到入口文件public/index.php处即可解决 header("Access-Control-Allow-Origin:*"); header(" ...

  10. ctf-misc-图片隐写术套路总结

    1.直接右键notepad打开,搜索flag,如果图片很多的话,可以写py脚本也    可以打开后搜索全部打开文件 2.是一个压缩包,改了后缀 3.图片中藏了一个二维码,用Stegsolve加几次滤镜 ...