第10.8节 Python包的导入方式详解
一、 包导入与模块导入的关系
由于包本质上是模块,其实对模块的许多导入方法都适用于包,但由于包的结构与模块有差异,所以二者还是有些区别的:
- 对包的导入,实际上就是包目录下的__init__.py文件的导入,因此凡是在__init__.py定义的成员都会按模块导入的方式执行导入,导入成员的访问方式;
- 包导入是可以在__init__.py执行包下模块或子包的导入。
二、 包导入方法及导入案例
包导入方法包括导入包本身、导入包下指定模块、导入包下模块的指定成员,由于包本质上也是模块,实际上这些方法都是与模块导入方法相同或类似。下面列的例子都是以《第10.7节 Python包的定义步骤》中规划的包为基础的。
本节的案例都是基于《第10.7节 Python包的定义步骤》的例子程序来介绍的,在本节就不重复粘贴相关源代码了。
- 直接导入包
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)语法: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)语法: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)语法: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)语法: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)语法: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
>>>
from包名.模块名import 成员1,…,成员n,导入包下模块的多个成员,此种方式与模块对应导入方法类似,只是导入时模块名前多了”包名.”,在此不展开细说;
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包的导入方式详解的更多相关文章
- Python包模块化调用方式详解
Python包模块化调用方式详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一般来说,编程语言中,库.包.模块是同一种概念,是代码组织方式. Python中只有一种模块对象类型 ...
- 第10.7节 Python包和子包的定义步骤
一. 包的定义步骤 按照包名创建或使用一个已有目录,目录名就是包名,必须注意包的目录必须位于Python加载模块的搜索路径中(具体请参考<第10.1节 Python的模块及模块导入>关于模 ...
- 第10.6节 Python包的概念
一. 引言 在<第10.2节 Python的模块及模块导入>介绍了模块的概念及导入的几个关键点,Python中的模块是一个单个的py文件,当我们开发的项目或功能集由多个文件构成时,我们需要 ...
- Python包管理工具setuptools详解及entry point
1.什么是setuptools? setuptools是Python distutils增强版的集合,它可以帮助我们更简单的创建和分发Python包,尤其是拥有依赖关系的.用户在使用setuptool ...
- 第10.9节 Python子包的导入方式介绍
在<第10.8节 Python包的导入方式详解>详细介绍了包的导入方式,子包也是包,子包的导入与包的导入方法上没有本质区别,但二者还是有所不同.本节对照二者的方式介绍子包与包导入的关系: ...
- 第7.14节 Python类中的实例方法详析
第7.14节 Python类中的实例方法详析 一. 实例方法的定义 在本章前面章节已经介绍了类的实例方法,实例方法的定义有三种方式: 1. 类体中定义实例方法 第一种方式很简单,就是在类体 ...
- Python安装、配置图文详解(转载)
Python安装.配置图文详解 目录: 一. Python简介 二. 安装python 1. 在windows下安装 2. 在Linux下安装 三. 在windows下配置python集成开发环境(I ...
- 【和我一起学python吧】Python安装、配置图文详解
Python安装.配置图文详解 目录: 一. Python简介 二. 安装python 1. 在windows下安装 2. 在Linux下安装 三. 在windows下配置python集成开发环境( ...
- Python中的高级数据结构详解
这篇文章主要介绍了Python中的高级数据结构详解,本文讲解了Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint这些数据结构的用法,需要的朋友可以参考 ...
随机推荐
- CSS总结(一)
1 css常用的一些属性 color: 文字颜色(前景色) font-size: 文字大小 font-family: 字体,比如:微软雅黑, 黑体,宋体,仿宋体,"Times New Rom ...
- python详细图像仿射变换讲解
仿射变换简介 什么是放射变换 图像上的仿射变换, 其实就是图片中的一个像素点,通过某种变换,移动到另外一个地方. 从数学上来讲, 就是一个向量空间进行一次线形变换并加上平移向量, 从而变换到另外一个向 ...
- TextView之富文本
项目中使用富文本比较常见了,一行显示多种样式颜色的文本,使用 ClickableSpan 富文本实现在同一个 TextView 中的文本的颜色.大小.背景色等属性的多样化和个性化. 我们也可以使用Ht ...
- 同步FIFO学习笔记
- python之深浅copy与id
我们都知道 所谓变量就是就是在空间中开辟一块内存空间.来存放东西的 学过c语言的都知道而数组也是有内存地址的 我们如何来查看内存地址呢?id()这函数就来了 x = 5 print(id(x)) 如此 ...
- ceph erasure默认的min_size分析
引言 最近接触了两个集群都使用到了erasure code,一个集群是hammer版本的,一个环境是luminous版本的,两个环境都出现了incomplete,触发的原因有类似的地方,都是有osd的 ...
- Oracle 集合类型
集合类型 1. 使用条件: a. 单行单列的数据,使用标量变量 . b. 单行多列数据,使用记录 [ 详细讲解请见: 点击打开链接 ] c. 单列多行数据,使用集合 *集合:类似于编程语言中 ...
- [i春秋]“百度杯”CTF比赛 十月场-Hash
前言 涉及知识点:反序列化.代码执行.命令执行 题目来自:i春秋 hash 如果i春秋题目有问题可以登录榆林学院信息安全协会CTF平台使用 或者利用本文章提供的源码自主复现 [i春秋]"百 ...
- tp5 跨域问题
只需要三行代码,写到入口文件public/index.php处即可解决 header("Access-Control-Allow-Origin:*"); header(" ...
- ctf-misc-图片隐写术套路总结
1.直接右键notepad打开,搜索flag,如果图片很多的话,可以写py脚本也 可以打开后搜索全部打开文件 2.是一个压缩包,改了后缀 3.图片中藏了一个二维码,用Stegsolve加几次滤镜 ...