• 第10.8节 Python包的导入方式详解


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

    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

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

  • 相关阅读:
    叙旧
    注册表的基本操作(.Net)
    如何自己实现 JavaScript 的 new 操作符?
    装饰者模式和TypeScript装饰器
    彻底弄懂GMT、UTC、时区和夏令时
    Javascript 中 cookie 操作方式
    javascript实例教程:使用canvas技术模仿echarts柱状图
    实现memcached客户端:TCP、连接池、一致性哈希、自定义协议
    Linux终端快速检测网站是否宕机的6个方法
    爬虫是什么吗?你知道爬虫的爬取流程吗?
  • 原文地址:https://www.cnblogs.com/LaoYuanPython/p/13643652.html
Copyright © 2020-2023  润新知