代码改变世界

第二十三章 模块包

2017-04-15 12:36  szn好色仙人  阅读(138)  评论(0编辑  收藏  举报
#1.
#A.除了模块名之外,导入也可以指定目录路径,python代码的目录称为包,因此这类导入称为包导入
#B.包导入路径最左边的部分是sys.path模块搜索路径中的一个目录
#C.import语句中的目录路径只能是以.来分隔,import以平台不相关的方式提供了目录路径写法
#D.如果使用包导入,那么包导入语句的路径中的每个目录内都必须有__init__.py文件(包含在sys.path的目录不需要含有此文件)
#E.__init__.py可以包含代码,也可以为空
#F.
'''
A:python首次导入某个目录时,会自动执行该目录下的__init__.py文件中的代码
B:导入一个目录后,会返回一个模块对象,而此对象包含了此目录中__init__.py文件中所赋值的所有顶层变量名
C:__init__.py实际上为目录(没有相对应的模块文件)所创建的模块对象提供了命名空间
D:可以在__init__.py中使用__all__列表来定义目录以from*导入的子模块的名称清单(这个过程会让使用from*的模块自动导入__all__列表中的子模块,而非顶层变量名)
E:如果没有定义__init__.py,from*不会自动加载嵌套在该目录内的子模块,取而代之的是加载__init__.py中定义的顶级变量名

'''

'''
目录层级:
主路径(Dir0,位于sys.path下),Dir0_Child和__init__.py(此文件内容:print("Dir0_Child", end = " "))
Dir0_Child内容:
    __init__.py:
        print("Test")
        __all__ = ['Test1']
        valueInit = '1'
    Test1.py:
        value = "Test1"
'''

from Dir0.Dir0_Child import*
import __main__
str = dir(__main__)
value = Test1.value                     #value = 'Test1'

from Dir0.Dir0_Child import*            #输出:Dir0_Child Test
import __main__
bValue0 = 'valueInit' in dir(__main__)  #bValue0 = False
bValue1 = 'Test1' in dir(__main__)      #bValue1 = True
value = Test1.value                     #value = 'Test1'

'''
若
Dir0_Child内容:
    __init__.py:
        print("Test")
        valueInit = '1'
则上述
bValue0 = True
bValue1 = False
'''

#2.
#A:reload可以接受点号路径名称,来进行重新载入
#B:使用as提供一个同义词
import Dir0.Dir0_Child as Dir           #没有输出
from imp import reload
reload(Dir)                             #输出Test

#3.
#A:包让导入更具有信息性,并可以作为组织工具,简化模块搜索路径,而且可以解决模糊性

#4.
#A:在包自身的内部,包文件的导入可以使用和外部导入一样的路径语法,但是也可以使用包内搜索规则来进行简化
#B:对于包中的导入,python3有2个新的变化:
#  她修改了模块导入搜索路径语义,以默认地跳过包自己的目录。导入只是检查搜索路径的其他组件,这叫做绝对导入
#  扩展了from语法,以允许显示的要求导入只搜索包的目录,这叫做相对导入语法
#C:from语句使用前面的.来指定,她们需要位于同一包的模块
#D:相对导入中的.用来表示包含文件的包目录,而导入就出现在该文件中,前面在加一个.将执行从当前包的父目录的相对导入
'''
位于某个模块A.B.C中的代码可以做如下导入:
from . import D     #import A.B.D
from .. import E    #import A.E
from .D import X    #import A.B.D.X
from ..E import X   #import A.E.X
注意:上述语法适用于包的相对导入,是无法导入主目录下的文件的
'''
#E:相对导入适用于只在包内导入,相对导入只是用于from语句

'''
主程序目录下有:
My.py:
    value = "Main_My"
Dir1文件夹:
    __init__.py:
        为空
    My.py:
        value = "Main_My"
    My1.py
        from . import My        
        #import My
        value = "Dir1_My1"
        value1 = My.value
'''

import Dir1.My1 as My1
value = My1.value               #value = 'Dir1_My1'
value1 = My1.value1             #value1 = 'Dir1_My'

'''
若My1.py修改为:
    My1.py
        #from . import My        
        import My
        value = "Dir1_My1"
        value1 = My.value
则:
value = 'Dir1_My1'
value1 = 'Main_My'
'''

#5.
#A:在3.3及以后的Python版本中,加入了新的模型:命名空间包。
#  其特性如下:
#  1.优先级最低,在已有版本所有的import规则之后;
#  2.要导入的文件夹中不能有__init__.py文件
#  3.主要依赖于sys.path中从左到右的搜索顺序