• 模块与包


    模块:
    
    '''
    
    模块: import | from
    含义:一系列功能的集合体
    优点:
    1.文件级别管理代码
    2.提高开发效率
    
    导入
    1.编译执行模块文件形成对应的pyc文件
    2.形成模块的全局名称空间,存放模块中的名字
    3.通过import关键字产生名字指向对应的地址(存放全局名称空间的地址)
    
        (一个文件产生一个全局名称空间,之间不互通)
        as 起名,原名字失效
    
    自执行与模块的区分
    __name__:==模块名()该文件为模块,被导入使用
    __name__:==__main__该文件为自执行文件
    
    '''
    
    
    -------------------------------------------------------------------------
    -------------------------------------------------------------------------
    -------------------------------------------------------------------------
    -------------------------------------------------------------------------
    
    
    
    包:
    通过文件夹来管理一系列功能相近的模块
    一系列模块的集合体
    
    重点:
    包中一定有一个专门用来管理包中所有模块的文件
    
    包名:
    存放一系列模块的文件夹名字
    存放的是管理模块的文件的地址,指向全局名称空间
    
    
    --( 包 )-----------------------------------------------------------------------
    --( 包 )-----------------------------------------------------------------------
    
    
    重点:包
    难点:包,循环导入
    
    1.模块加载顺序
    2.模块导入执行顺序
    3.循环导入(*****)
    4.创建并使用包
    5.importfrom
    6.绝对导入,相对导入(***)
    
    
    --( 模块的加载顺序 )-----------------------------------------------------------------------
    --( 模块的加载顺序 )-----------------------------------------------------------------------
    
    
            第一次导入:内存 > 内置 > sys.path(一系列自定义模块)
            最终在自定义中找到,完成导入,并在内存中缓存模块的内存地址
    
            再次导入,从内存中就可以直接找到,
            即时当前文件为删除状态,内存中的地址仍然可以被引用
    
    import time # (built-in)内置
    print(time)
    
    import sys
    print(sys.path)
    
    
    --( 环境变量 )-----------------------------------------------------------------------
    --( 环境变量 )-----------------------------------------------------------------------
    
    
    环境变量:存放文件路径的列表
    
    重点:默认列表第一个元素就是当前被执行文件所在的目录
    可以自定义往sys.path添加路径
    
            sys.path.append(想添加文件的绝对路径)  # 添加到末尾
                    def append(自定义):
                    'S.append(value)——将value追加到序列的末尾'
    
            sys.path.insert(0,想添加文件的绝对路径)  # 添加到指定索引
                    def insert(self, index, value):
                    insert(index, value)——在index索引 之前插入值。
    
    
    --(导入模块的执行顺序 )-----------------------------------------------------------------------
    --(导入模块的执行顺序 )-----------------------------------------------------------------------
    
    
            看图 (模块导入的执行流程)
    
    
    --(循环导入产生的问题 )-----------------------------------------------------------------------
    --(循环导入产生的问题 )-----------------------------------------------------------------------
    
    
    两个模块之间相互导入,且相互使用其名称空间中的名字,但是有些名字没有产生
    
            主要原因:流程顺序
            再次导入是对名字的引用
            from X (只进入) import Y (未调用)
            from 导入后马上会使用名字,但是没产生赋值,极容易出现错误
            建议:使用import循环导入
    
    
    
    --(解决循环导入的问题 )-----------------------------------------------------------------------
    --(解决循环导入的问题 )-----------------------------------------------------------------------
    
    
    1.先定义,后引用
    2.先提前产生名字,在导入模块
            A = 32131
            import
            from 导入后马上会使用名字,但是没产生赋值,极容易出现错误
    3.在导入逻辑放在函数中,将导入的逻辑延后到函数的调用,还是先产生,后引用
    
    
    --( 包的导入 (课件) )-----------------------------------------------------------------------
    --( 包的导入 (课件) )-----------------------------------------------------------------------
    
    导包的点语法: import & from 导入包,点的左侧必须都是文件夹
    
            import本质:通过查找环境变量中的绝对路径来完成导入
            导包:
                    1.保证包所在文件夹在环境变量中
                    2.导入的文件夹就是包名
    
            import pk
            pk(文件夹)
            包含__init__.py文件
    
    总结:
            包名为文件夹名字,名称空间是由__init__.py产生
            导包的点语法: import & from 导入包,点的左侧必须都是文件夹
            使用保重模块中的名字:采用import导包
            在包内置的 __init__.py 文件中不建议import管理名称,不建议起别名
    
            在使用文件中
            直接在要使用的文件中用import一层层找需要的名字
            import 包名.文件名 as 别名
            起完别名,原名不可以再使用
    
    
    --( from & import导入区别 )-----------------------------------------------------------------------
    --( from & import导入区别 )-----------------------------------------------------------------------
    
    
            导包点语法:左侧必须为文件夹
            外界通过import导入方式最多只能导到模块
            外界通过from可以访问到具体变量函数名
    
    
    --( 绝对导入:包中使用import导入 )-----------------------------------------------------------------------
    --( 绝对导入:包中使用import导入 )-----------------------------------------------------------------------
    
    
            在包的__init__文件中
            import 模块名 (问题:所属包不在环境变量,报错)
            import 包名.模块名 (问题:包所属文件夹不在文件变量,报错)
            import 包名.模块名 as 别名 (外界都可以访问)
            import 包名.模块名.名 (问题:导包,点语法左侧必须都是文件夹)
    
            外界... ...
    
    
    --( 绝对导入 )-----------------------------------------------------------------------
    --( 绝对导入 )-----------------------------------------------------------------------
    
    
            (绝对导入).jpg
    
    
    --( 相对导入 )-----------------------------------------------------------------------
    --( 相对导入 )-----------------------------------------------------------------------
    
    
            点语法,一个点代表当前层,每加一个点提升一层级
            from . import name (当前层)
            from .. import name (出一层)
            from ... 包 . import name (出两层)(又进一层)
    
            from . import name
            from . 表示当前文件的所在文件夹
            __init__文件中的名,可由点语法直接调用
            由相对导入 (点语法) 的文件都不能自执行
  • 相关阅读:
    php 获取完整url地址
    Apache Module mod_reqtimeout
    How To Mitigate Slow HTTP DoS Attacks in Apache HTTP Server
    IE8/IE9/IE10打开网页后,自动设置浏览器模式为“IE8/IE9/IE10兼容性视图”
    关于Slow HTTP Denial of Service Attack slowhttptest的几种慢攻击DOS原理
    apache slowloris mod_antiloris for Apache httpd 2.2 / 2.4
    jquery.min.js v1.10.3版本autocomplete方法会在text前添加搜索出多少项的文本信息 要去除
    Tiling_easy version
    "巴卡斯杯" 中国大学生程序设计竞赛
    人见人爱A+B
  • 原文地址:https://www.cnblogs.com/max404/p/10723979.html
Copyright © 2020-2023  润新知