第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这些数据结构的用法,需要的朋友可以参考 ...
随机推荐
- 什么是4G模块 4G模块的工作原理及特点
什么是4G模块 4G模块,也被叫做4G通信模块或4G DTU模块,他是物联网行业具有4G通信功能的一种产品,通过4G模块,我们可以实现工业设备数据通过无线4G网络传输到远端控制中心,并从控制中心通过4 ...
- 1.流程控制--if
流程控制--if -*- coding:utf-8 -*- #定义字符编码 1.判断条件if age = input("输入年龄:") #将交互式输入内容赋值给age,默认内容为字 ...
- C# type对象
新建控制台应用程序 新建一个类 class MyClass { private int id; private int age; public int numb; public string Name ...
- Spider--实战--selenium_12306
# login12306_02 # 图像识别涉及到深度学习,这里直接将验证码识别任务发送到大佬的验证码解析地址,不过现在已经失效了,程序跑到这会报错. # 用户名和密码存储在本地工作目录中的 user ...
- JS仿贪吃蛇:一串跟着鼠标的Div
贪吃蛇是一款80后.90后比较熟悉的经典游戏,下面通过简单的JS代码来实现低仿版贪吃蛇效果:随着鼠标的移动,在页面中呈现所有Div块跟随鼠标依次移动,效果如下图所示. <!DOCTYPE htm ...
- 采用“传统”方式获取当前HttpContext
我们知道"依赖注入"已经成为了.NET Core的基本编程模式,表示当前请求上下文的HttpContext可以通过注入的IHttpContextAccessor服务来提取.有时候我 ...
- python执行rados命令例子
前言 我们以前的管理平台在python平台下面做的,内部做的一些操作采用的是命令执行,然后解析的方式去做的,ceph自身有python的rados接口,可以直接调用原生接口,然后直接解析json的方式 ...
- rbd的image快照与Pool快照
前言 这个问题是不久前在ceph社区群里看到的,创建image的时候,当时的报错如下: 2016-12-13 23:13:10.266865 7efbfb7fe700 -1 librbd::image ...
- RESTFul服务开发必备的一款IDEA插件!用了就离不开了
我们经常谈 RESTful Web 服务开发,但是我发现很多人实际就根本不懂这个概念.只是听着大家都这么说,也就跟着一起说了,哈哈哈! 因此,在开始推荐这个IDEA插件之前,非常有必要花一小会时间简单 ...
- python-基础入门-6快速入门总结
快速入门 程序输出: 1.print语句,字符串用双引号括起来 _在解释器中表示最后一个表达式的值. print语句 与字符串格式(%)结合使用,能实现字符串替换功能. >>>pri ...