zoukankan      html  css  js  c++  java
  • 模块介绍

    模块基本概念:

             模块就是一系列功能的集合体,包括:内置模块、第三方模块、自定义模块。

              模块格式:1、使用Python编写的.py文件;2:、已被编译为共享库或DLL的C或c++扩展;3、把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,改文件夹称之为包);使用C编写的并连接到Python解释器的内置模块

             模块的使用价值:1.使用内置模块或者第三方模块就是拿来即用,可以极大地提高开发效率2.使用自定义模块可以减少代码冗余(抽取我们自己程序中要公用的一些功能定义成模块,然后程序的各个部分组件都去模块中调用这些共享的功能。)

              注意:模块的使用要分清楚哪个是执行文件,哪个是被导入文件。

    二,

    1.import导入模块:

    在执行文件中导入被执行文件的模块(比如一个文件名是spam.py,模块名就是spam),运行执行文件,会导致执行文件中模块的触发,执行被导入文件中的代码。首先在运行执行文件时,会在内存中造一个执行文件的名称空间(比如造一个run.py的名称空间), 如果文件中还有其他变量名,也统统在执行文件中的名称空间内部造出一个名称空间,存取变量名(名称)对应值的内存地址。执行被导入文件中的模块,在执行过程中产生的名字都放到模块的名称空间中去,存的都是名称对应值的内存地址;比如变量名、函数名等的名称,模块是在执行文件中定义的,所以模块的内存地址是在执行文件中的名称空间中 。如下图:

    首次导入模块的结果产生:

    1)会产生一个模块的名称空间;2)执行模块对应的那个文件,将执行过程中产生的名字都放到模块的名称空间中; 3)在当前执行文件的名称空间中拿到一个模块名,该名字指向模块的名称空间。

    导入模块后,都是直接引用第一次导入的成果,不会重新执行文件。

    执行文件中访问模块名称空间中名字的语法:模块名.名字

    总结:import导入模块在使用时是前缀+模块名

    优点:知指名道姓地向某一个名称空间要名字,不会与当前名称空间中地名字冲突

    缺点:但凡应用模块中的名字都要加前缀,不够简洁。

    import:

    除此之外还可以一行导入多个模块,但不推荐使用,这样写不够清晰。

    import spam,time,os

    还可以为模块起别名(Python中的模块名应该全为小写)

    import spam as sm 

    print(sm.money)

    print(sm.read1)

    2.from...import...导入模块

    首次导入模块发生3件事
     1). 创建一个模块的名称空间
     2). 执行文件spam.py,将执行过程中产生的名字都放到模块的名称空间中
     3). 在当前执行文件中直接拿到一个名字,该名字就是执行模块中相对应的名字的(与import导入模块名的不同之处,其直接导入只想的是一个变量名)

    当money=200在调用的money之上时返回的是模块中的值,当money=200,在调用的money之下时会覆盖掉模块中的值,返回执行文件run.py中的money的值。

    总结:    from...import...

    1)优点: 使用时,无需再加前缀,更简洁;2) 缺点: 容易与当前名称空间中的名字冲突。

     *代表从被导入模块中拿到所有名字(不推荐使用),这样如果执行文件中的名字如果与其冲突,就极易出错。所以要根据情况使用,如果模块中几乎大多数功能都使用了,那么推荐用*,这样简化了代码的臃肿,如果就使用了几个功能,那么建议明确地写上导入了什么。

    __all__在from...import中的使用(在模块的开头加上__all__指定的的元素,指定的元素可以用,其他的元素都被默认为没有定义)

    循环导入问题:

    解决方案一:将m1.py和 m2.py中的x=‘m1’、y=‘m2’都放到对应.py文件导入模块(循环语句)的下方;

    解决方案二:将名字放在函数体内部,利用函数在定义阶段不执行代码,只检测代码的特点,在调用的时候x,y的名字的名称空间都已经建立完毕

    两种方案其实都是将要导入的名字都提前在名称空间里获取到,在循环导入的时候就能获取到这个名字。

    区分Python文件的两种用途:

    如果测试者要测试.py里面的文件,如果直接用模块调用,就必须一次性把被导入文件跑完,耗时耗力,这里我们在.py文件中使用__name__方法判断,如果是右键运行.py 文件,if判断 __name__ == '__main__':,成立,程序能运行起来。在导入改文件的模块的文件中,右键运行,就会被if判断 __name__ == '__main__':阻断,从而让被导入文件停止运行。然后测试者可以在执行文件中根据模块名+ .  的方式调用自己想测试的代码。

    文件的查找路径的优先级

        

    模块搜索路径的优先级
         1. )内存中已经加载过的  2. 内置模块   3. sys.path(默认第一个值是当前执行文件所在的文件夹)

           

    模块的绝对导入:以执行文件的sys.path为起始点开始导入,称之为绝对导入。sys.path的查找顺序的环境变量是以当前执行文件为基准的,即所有被导入的模块参照环境变量sys.path都是以执行文件为准的。

    优点: 执行文件与被导入的模块中都可以使用(都可以以sys.path为起始点);  缺点: 所有导入都是以sys.path为起始点,导入麻烦

    相对导入:参照当前所在文件的文件夹为起始开始查找,称之为相对导入

     符号: .代表当前所在文件的文件夹,  ..代表上一级文件夹,  ...代表上一级的上一级文件夹

    优点: 导入更加简单;   缺点: 只能在导入包中的模块时才能使用,不能在执行文件中用 

  • 相关阅读:
    May 1 2017 Week 18 Monday
    April 30 2017 Week 18 Sunday
    April 29 2017 Week 17 Saturday
    April 28 2017 Week 17 Friday
    April 27 2017 Week 17 Thursday
    April 26 2017 Week 17 Wednesday
    【2017-07-04】Qt信号与槽深入理解之一:信号与槽的连接方式
    April 25 2017 Week 17 Tuesday
    April 24 2017 Week 17 Monday
    为什么丑陋的UI界面却能创造良好的用户体验?
  • 原文地址:https://www.cnblogs.com/zhangchaocoming/p/11198544.html
Copyright © 2011-2022 走看看