zoukankan      html  css  js  c++  java
  • 模块中的包的定义和使用

    一.模块的搜索路径

    模块的加载路径:内存==》内置模块==》sys.path(系统内置的环境变量,一系列自定义的模块)

    import sys
    print(sys.path) #查询系统的环境变量,以列表的形式进行存储
    # 默认第一个元素就是当前被执行的文件目录
    
    
    # 我们可以自定义的去加入系统的配置
    sys.path.append(r'想导入的模块的绝对路径')
    sys.path.insert(r'想导入的模块的绝对路径')   # 可以添加到指定的位置

    二.模块导入的指定的流程

    '''
    导入模块的指令:
        -- 相对于 函数名() 调用函数体,函数调用会进入函数体,从上至下逐句解释执行函数体代码
        -- 导入模块,会进入模块文件,从上至下逐句解释执行模块文件代码
        -- 如果在模块中又遇到导入其他模块,会接着进入导入的模块,从上至下逐句解释执行文件中代码,依次类推
    '''

    三.循环导入

    所谓的循环的导入,实质上就是模块之间形成的环状调用,就比如说,模块一中需要模块二中的变量名,反之,模块二需要模块一的变量名,这就是循环导入。

    循环导入会存在很多问题:

          1.-- 导入模块是要使用模块中的变量

          2.-- 正常逻辑都是在文件最上方先完成对模块的导入,再在下方定义自身模块变量,以及使用导入的模块中的变量

          3.-- 由于导入模块的特殊机制,第一次导入模块会编译执行导入的模块,也就是会进入模块逐句执行模块内容,再次导入只是使用内存中的名字
          4.-- 就会出现下面的情况,m2在使用m1中的变量x,但变量x却并未产生,这就出现了循环导入问题

    列如:

    m1.py文件
    import m2
    x = 10
    print(m2.y)
    
    m2.py文件
    import m1
    y = 10
    print(m2.x)
    
    
    # 针对循环导入的问题,我们可以采用延迟导入的方式来处理。
    #       1.将循环导入的包中的变量名进行提前定义,再导入到相应的包中
    #       2.将导入包的路径提前封装在一个函数中,保证在逻辑函数的调用在变 
    #          量定义之后    
    
    “”“
    重点:
    问题:from导包极容易出现循环导入问题
    解决:建议from导入方式改用import导入方式
    “””

    四.包的认识

    包通过文件夹来管理一系列功能的相近的模块。

    包:是一系列的模块的集合体。包中一定要有专门管理包的所有模块的文件。

    包名:是存放一系列模块的文件夹名字,包名是存放的是管理模块的那个文件的地址,指向的是全局名称空间

    五.包的导入

    #  包的导入实质上是通过查找环境变量的绝对地址来完成导入的。
    
    
    # 要注意的是:
              1.导入的包的文件夹必须添加到环境变量里
              2.导入的文件夹名就是包名
    
    # 在导入包的文件夹中一定有__init__.py文件

    六.导入模块和导入包相应完成的三件事

    # 导如模块完成的三件事:
        1.编译执行模块module.py文件,并相应的生成__pycache__文件。
        2.在该模块中产生相应的global的全局名称空间
        3.在该模块的全局名称空间中产生相应的一个变量名称空间
    
    
    # 导入包完成的三件事:
        1.编译执行包中的__init__.py文件,会在包中__pycache__创建对应的 
           pyc文件
        2.产生__init__.py文件的全局名称空间,用来存放__init__出现的名字
        3.产生包名指向__init__.py文件的全局名称空间 | 指定变量名指向包中指 
          定名字

    七.模块的导入之import

    '''
    注意点:
    1.在包__init__.py中不建议使用import导入
    2、在包__init__.py中不建议使用as起别名
    总结:不建议__init__.py中采用import管理名字 ==> 空着不写
    
    在使用文件中
    直接在要使用的文件中用import一层层找到你想要的名字
    import 包名.文件名 as 别名
    
    # 起完别名,原名不可以再使用
    原名:包名.文件名 => 包名.文件名.变量名
    别名:别名 => 别名.变量名
    
    '''

    八.包中的模块导入之绝对路径

    # 在包的__init__文件中
    import 模块名  # 问题:所属包不在环境变量,报错
    import 包名.模块名  # 问题:包所属文件夹不在文件变量,报错
    import 包名.模块名 as 别名  # 在外界:包名.模块名 | 包名.别名 都可以访问
    import 包名.模块名.名字  # 问题:导包语句.语法左侧必须全部是包(文件夹)
    
    
    # 外界
    import 包名
    包名.名字  # 访问的是__init__中的名字
    包名.模块  # 访问的模块这个地址
    包名.模块.名字  # 访问的模块中的名字
    
    import 包名.模块
    包名.模块  # 访问的模块这个地址
    包名.模块.名字  # 访问的模块中的名字
    
    from 包名 import 模块
    模块  # 访问的模块这个地址
    模块.名字  # 访问的模块中的名字
    
    from 包名.模块 import 名字
    名字  # 访问的模块中的名字

    九.包中导入模块之相对路径

    # 没有子包
    ''' 1)
    pk包
        -- __init__.py
            -- 名字 a = 10
        -- pkm.py
            -- 名字 b = 20
        
    在外界
    import pk
    pk.a 访问a
    pk.b 访问b
    
    init管理文件
    a不需要操作
    from .pkm import b
    
    '''
    
    # 有子包
    
    ''' 1)
    pk包
        -- __init__.py
        sub子包
            -- __init__.py
                名字 x = 10
            -- subm.py
                名字 y = 10
        
    在外界
    import pk
    pk.x 访问x
    pk.y 访问y
    
    在pk的init管理文件
    from .sub import x
    from .sub.subm import y
    '''
    
    ''' 2)
    pk包
        -- __init__.py
        sub子包
            -- __init__.py
                名字 x = 10
            -- subm.py
                名字 y = 10
        
    在外界
    import pk
    pk.sub.x 访问x
    pk.sub.y 访问y
    
    在pk的init管理文件:要产生sub名字
    from . import sub  => pk.sub
    
    在sub的init管理文件:要产生x,y名字
    x不需要操作  => pk.sub.x
    from .subm import y  => pk.sub.y
    
    '''
    
    # 注:有相对导入.语法的文件都不能自执行
  • 相关阅读:
    EdgeX Foundry初体验(五)-- Web Console图形界面(v1.0.0)
    第十九节:SQLServer通过发布订阅实现主从同步(读写分离)详解
    第六节:Ocelot之自身负载、网关限流、缓存和熔断机制
    第十九节:SQLServer通过发布订阅实现主从同步(读写分离)详解
    第十七节:分区、分表、分库以及基于EFCore实现读写分离
    第六节:IdentityServer4设备流授权模式和扫码登录(应用于IOT)
    第五节:IdentityServer4的Pkce机制、令牌刷新机制、混合授权模式
    第十一节:IdentityServer4授权码模式介绍和代码实操演练
    第十二节:Ocelot集成IDS4认证授权-微服务主体架构完成
    第十节:IdentityServer4隐式模式介绍和代码实操演练
  • 原文地址:https://www.cnblogs.com/wanglei957/p/10679155.html
Copyright © 2011-2022 走看看