一、导入模块的两种方式

  1、import导入:使用模块内名字时,需要加模块名前缀。

    ①优点:因为有模块名前缀,所以不会与使用程序的名称空间内名字重复。

    ②缺点:因为有模块名前缀,所以名字显得冗长。

  2、from...import:若用from声明过名字所处的模块名称空间,再使用该名字则不用加模块名前缀。

    ①与import导入过程的相同点:开辟模块的名称空间===》执行模块文件===》将模块中的名字放入模块名称空间中。

    ②与import导入过程的不同点:使用程序的名称空间内会产生与模块名称空间相同的名字,指向对应的内存地址。

    ③优点:因为不用加模块名前缀,所以名字显得更精简。

    ④缺点:因为没有了模块名前缀,所以名字指向的内存地址可以在使用程序内被修改覆盖。

    ⑤单行导入:可以跟import一样,使用from...import 名字1,名字2,名字3...的形式在单行导入多个名字,但是不推荐这样使用。

    ⑥导入全部:可以用from...import *的形式一次导入模块中所有名字。在模块中所有名字可以用__all__规定范围。

    ⑦起别名:from...import 本名 as 别名。

二、模块搜索路径的优先级:检索导入模块是否有效。

  1、第一步:在内存里面找,刚启动py文件时,内存里只有内置模块的名称空间。

    ①一劳永逸机制:第一次导入模块后,在使用程序运行过程中所申请的内存内,模块名称空间会一直保留,哪怕中途解除了模块名与模块名称空间的绑定,模块名称空间也不会因为引用计数为0而被回收。

    ②sys.modules:查看已加载到内存的名称空间。

  2、第二步:按照环境变量sys.path中存放的文件夹路径的顺序依次查找导入模块是否存在。

    ①sys.path:就是一个存放多个文件夹路径的列表,其中第一个文件夹就是使用文件的所在文件夹。

    ②sys.path.append():把模块所处的文件夹路径填入环境变量,即可在导入时检索此列表而找到模块。

三、模块类型之包:包就是一个包含__init__.py文件的文件夹,本质上是模块的另一种形式,可以被当作模块导入。

  1、导入包的过程:

    ①产生一个包的名称空间。

    ②运行包文件夹下的__init__.py文件,将运行过程中产生的名字丢入包的名称空间。

    ③使用程序的名称空间中产生包的名字,该名字指向包的名称空间。

  2、统一环境变量:所有被执行文件导入的模块需要参照sys.path时,都是以执行文件的sys.path为准。

  3、包的导入:

    ①包的导入也有两分import与from...import两种方式。

    ②无论用哪种方式,导入时若要声明父级文件夹,即点的左边必须是一个包,即必须是文件夹,否则会因形式非法而报错,即导入时不能包含模块名.名字的形式。由此可以得出,用import导入时不能具体到名字,最多到模块名,若要具体到名字,需用from...import 名字的形式。

    ③导入后使用名字则没有该项限制,可以通过加前缀定向引用某名字。

    ④可以在父级文件夹上再加父级文件夹,但不是不能越过在执行文件的环境变量中声明的文件夹。

    ⑤导入包的本质就是在导入__init__.py文件,包的名称空间本质就是__init__的名称空间,导入包时产生的名字就是存入该空间。即导入和使用时都屏蔽了中间.__init__.的格式。

    ⑥包导入时同样可以使用单行导入多个名字,全部导入以及起别名这些方法。

 

 

posted on 2020-02-01 02:01  焚音留香  阅读(310)  评论(0编辑  收藏  举报