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