• 第二十三章 模块包


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

      

  • 相关阅读:
    5月读书日志
    把代码搬到Git Hub 吧(一)
    RTX二次开发(二)(基于ASP.NET)
    RTX二次开发(一)(基于ASP.NET)
    文件夹下迭代查询文件
    JS URL传递中文参数时出现乱码的处理
    js实现上下滑动侧边栏
    基本select语句的生命周期
    NodeJs下的测试框架Mocha
    带新人感想
  • 原文地址:https://www.cnblogs.com/szn409/p/6713973.html
Copyright © 2020-2023  润新知