一、 包导入与模块导入的关系
由于包本质上是模块,其实对模块的许多导入方法都适用于包,但由于包的结构与模块有差异,所以二者还是有些区别的:
二、 包导入方法及导入案例
包导入方法包括导入包本身、导入包下指定模块、导入包下模块的指定成员,由于包本质上也是模块,实际上这些方法都是与模块导入方法相同或类似。下面列的例子都是以《第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](https://blog.csdn.net/LaoYuanPython)
请大家多多支持,点赞、评论和加关注!谢谢!**
手机扫一扫
移动阅读更方便
你可能感兴趣的文章