zoukankan      html  css  js  c++  java
  • 模块

    模块

    1.模块:一系列功能的集合

    2、为什么会出现模块:很多相似的功能,要统一管理,将这些功能放在一个文件中,管理这些功能的集合体,命名为模块

    3、怎么使用模块

    -- 在要使用模块功能的文件中导入模块:import 模块名

    - 模块名:用来管理一系列功能的文件名

     4、在哪使用模块

    -- 在所有要使用模块中功能的文件中导入并使用模块

    常见的四种模块

    1.使用python编写的.py文件

    2.把一系列模块组织到一起的文件(文件夹下有一个_init_.py 文件,改文件称为库)

    3.使用c编写并链接到python的解释器的内置模块

    4.已被编译为共享库或DLL的C或C++扩展

    import模块的过程

    首次

     1.将被导入的模块编译形成对应的pyc文件

     2.进入模块,由上开始执行执行模块中的代码,将产生的所有名字存放在该模块文件的全局名称空间中

     3.在使用模块的文件中,产生一个与模块名(模块文件名)同名的名字,指向模块的全局名称空间

    import m1
    print(m1.__dict__)
    print(m1.__dict__['a'])
    print(m1.a)
    print('t1 end')

     

    print(m1.m1)

     

    x = 200

    print(x)

     

    m1.fn1()

     重点:全局名称空间附属于文件,但又相互独立,直接使用名字,就一定会在当前文件的全局名称空间中查找

    再次

     再次导入模块,不再执行导入模块的前两步,直接走第三步

           -- 在当前模块中产生一个名字,指向第一次导入在内存中产生的全局名称空间

    print(m1.m1)

     

    x = 200

    print(x)

     

    m1.fn1()

    起别名

    import 模块名 as 别名

     重点:导入一旦起别名,原模块名变量就会失效,本质上只产生了别名变量指向模块文件的全局名称空间

    import m1 as mm

    import time    time模块

    # time.sleep(5)

    print('>>>', m1.a)

    print('>>>', mm.a)

    模块分类

    内置(built-in)

    自定义(系统提供|第三方提供|自定义)

    加载顺序

    内置>sys.path(安装环境变量中路径的先后顺序逐一加载)

     

    环境变量:存放路径的list

    sys.path就是环境变量

    默认为当前执行文件所在的路径

    清空环境变量:所有导入都不能使用

    sys.path.clear()

    添加指定路径到环境变量

    sys.path.append()

    sys.path.insert()

    from...import语法导入

     导入完成的三件事

    1.将被导入的模块编译形成对应的pyc文件

    2.进入模块,从上执行执行模块中的代码,将产生的所有名字存放在该模块文件的全局名称空间中

    3.在导入模块的文件中形成(一个或多个)名字指向模块全局名称空间中的(一个或多个)具体名字

     

    from 模块名 import 模块中的名字1, ..., 模块中的名字n

    from 模块名 import 名字 as 别名

    from...import导入依赖环境变量 sys.path

    b = lambda x: x * 10
    c = 666

    d_ = 888

    _e = 10000

    __all__ = ['a', 'b', 'c', 'd_', '_e']

    from...import*

     模块中默认会添加 __all__ ,__all__ 就是管理模块中能被 * 导入的变量们

     __all__可以自定义,自定义 * 能导入的变量们, __all__的list中名字全部可以自定义

     系统默认添加的__all__中不会纳入 _开头的名字

           -- 所以默认在外界通过from...import *无法导入_开头的名字

    -- _开头的名字对from...import *是隐藏的,指名道姓依然可以被外界导入使用

     

    提倡:1.省略了点语法 2.指名道姓可读性强 3.可以起别名解决冲突
     from m1 import a as m1_a, b as m1_b, c as m1_c
     print(m1_a)
     print(m1_b(10))
     print(m1_c)

    from m1 import *
    print(a)
    print(b)
    print(c)
    print(d_)
    print(_e)

     from m1 import _e
     print(_e)

     

    链式导入

     t1导入m1,m1导入m2,m2导入m3

     执行流程:右键执行t1,在t1导入m1模块的地方直接进入m1,去执行m1,同理在m1执行过程中遇到导入m2,会马上进入m2,去执行m2,一直到m3,m3执行完毕,会回到m2中导入m3的语句,接着往下执行m2,m2执行完毕回到m1,以此类推返回到t1

     在整个执行流程中,遇到任何模块的二次导入,都是直接引用内存中的名称空间,不会再次进入模块

    循环导入

     循环导入的问题点:名字没有产生就使用名字

     解决循环导入:先产生名字,在导入模块

           -- 将会产生循环导入的模块,导入语法延后 - 延后导入

     

     

     问题

    # m1.py

    import m2

    print(m2.y)

    x = 666

     

    # m2.py

    import m1

    print(m2.x)

    y = 888

     

     

     

    # 解决

    # m1.py

    x = 666

    import m2

    print(m2.y)

     

     

    # m2.py

    y = 888

    import m1

    print(m2.x)

     

     

  • 相关阅读:
    Sql 格式化日期
    shape 格式标准
    flex 状态
    flex 特效集
    invalidateProperties
    flex for循环
    关于继承
    win32常见寄存器register
    asm寻址方式
    java jni调用 非托管 dll
  • 原文地址:https://www.cnblogs.com/komorebi/p/10816205.html
Copyright © 2011-2022 走看看