#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中从左到右的搜索顺序