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

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

  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. php 使用 phpword 操作 word 读取 word

    思路 1. 加载word文件.2. 循环判断加载出来的数据.( 数据下面有很多个节点 )( 节点是按照数据的类型分类的 例如 无样式的文本是RunText,换行是TextBreak,表格是table. ...

  2. 部署Dotnet Core应用到Kubernetes(一)

    最近闲了点,写个大活:部署Dotnet应用到K8s.   写在前边的话 一直想完成这个主题.但这个主题实在太大了,各种拖延症的小宇宙不时爆发一下,结果就拖到了现在.   这个主题,会是一个系列.在这个 ...

  3. Docker系列02—Docker 网络模式

    一.Docker的四种网络模式 1.Docker 的四种网络模式: Bridge container 桥接式网络模式 Host(open) container 开放式网络模式 Container(jo ...

  4. [MIT6.006] 12. Square Roots, Newton's Method 平方根,牛顿法

    首先让我们回顾下上节课讲的,用牛顿法计算√2的内容: 简单来说,牛顿法从x0=1不断向后计算逼近√2的值,而刚开始计算的精度是1,随着牛顿法的逼近(共log2d个循环),就能使得√2逼近值的精度达到d ...

  5. 模块化-CommonJs、AMD、CMD、ES6

    在了解AMD,CMD规范前,还是需要先来简单地了解下什么是模块化,模块化开发?模块化是指在解决某一个复杂问题或者一系列的杂糅问题时,依照一种分类的思维把问题进行系统性的分解以之处理.模块化是一种处理复 ...

  6. const常量与define宏定义的区别(转)

    #define RADIUS 100; const  float   RADIUS = 100; (1) 编译器处理方式不同 define宏是在预处理阶段展开. const常量是编译运行阶段使用. ( ...

  7. mds的cpu占用问题分析以及解决办法

    前言 mds是ceph里面处理文件接口的组件,一旦使用文件系统,不可避免的会出现一种场景就是目录很多,目录里面的文件很多,而mds是一个单进程的组件,现在虽然有了muti mds,但稳定的使用的大部分 ...

  8. tomcat设置好环境变量,依然无法通过cmd startup命令启动

    Windows环境下JDK安装与环境变量配置详细的图文教程 https://www.cnblogs.com/liuhongfeng/p/4177568.html   Windows环境下maven 环 ...

  9. 虚拟机搭建CentOS 7系统

    准备工作先查看本机是否开启虚拟化 可以打开任务管理器中性能选项 可以看到虚拟化默认关闭,可通过打开BIOS,找到Configuration或Security选项,把Virtualization或者In ...

  10. Canvas实现放大镜效果完整案例

    本文主要记录 canvas 在图像.文字处理.离屏技术和放大镜特效的实现过程中使用到的API.先看下效果吧: 一张模糊的图片: 鼠标点击任意位置,产生放大效果: 哇塞~ 一个帅哥,哈哈哈哈~ 1.显示 ...