zoukankan      html  css  js  c++  java
  • 初识模块

    一、模块的定义与分类

      在进入模块学习之前,我们要知道什么是模块?一个函数封装功能,我们使用的软件由多个函数组成,这些函数不可能放在同一个文件之下,那应该怎么办?我们可以将这些相同的功能封装在一个文件夹,那么这个存储很多常用的功能.py文件,就是模块。

      模块的分类:在python中,模块分为三类。

        第一类:内置模块,也称为标准库。这种模块就是python解释器给我们提供的。比如time模块,os模块等

        第二类:第三方模块,一些python大神写的好的比较好用的模块

        第三类:自定义模块,我们自己定义的一些模块

    二、import语句

      模块的引入,我们在这块一定要注意区分哪个是执行文件,哪个是被导入文件。

      模块可以包含可执行的语句和函数的定义,这些语句的目的是初始化模块,它们只在模块名第一次遇到导入import语句时才执行(import语句是可以在程序的任意位置放置使用,针对同一个模块import很多次,为了防止重复导入,python在这里做了简单的优化,后续的import语句仅是对已经加载到内存中的模块对象增加了一次引用,不会重新执行模块内的语句)

    import meet
    import meet
    import meet
    import meet
    import meet
    
    执行结果:只是打印一次:
    from the meet.py
    

      一个模块只会被导入一次,不管你执行了多少次import。这样可以防止导入模块被一遍又一遍地执行。

      右键运行一个.py文件首先会创建以模块名命名的名称空间,首次导入模块有以下三个步骤:1.运行以模块名命名的文件2.运行文件中的代码将产生的名字与值放在以模块名命名的名称空间中,3.在执行文件中产生一个指向名称空间的名字。

      被导入模块有各自的名称空间:

      每个模块都有自己独立的名称空间,定义在这个模块中的名称函数,把这个模块的名称空间当做全局名称空间,这样我们在编写自己的模块时,就不用担心我们定义在自己模块中全局变量会在被导入时,与使用者的全局变量冲突。

      示例如下:

    当前是test.py
    
    import meet
    name = 'alex'
    print(name)
    print(meet.name)
    
    '''
    运行结果:
    from the meet.py
    alex
    郭宝元
    '''
    
    def read1():
        print(666)
    meet.read1()
    
    '''
    运行结果:
    from the meet.py
    meet模块: 郭宝元
    '''
    
    name = '日天'
    meet.change()
    print(name)
    print(meet.name)
    
    '''
    运行结果:
    from the meet.py
    日天
    宝浪
    '''
    

      导入多个模块:导入多个模块时,推荐一个一个的导入。

    推荐写法
    
    import os
    import sys
    import time
    

      通常导入模块的句式会写在文件的开头。

    三、from...import...语句

      创建以模块名命名的名称空间,首次导入以模块名命名的模块:1.运行这个模块2.将产生的名字存放在以模块名命名的名称空间中3.直接拿到指向模块名称空间中某个值的名字。

      与import相比:1.访问模块中的名字不需要加模块名前缀。2.在访问模块中的名字可能会与当前执行文件中的名字冲突。

      from...import *  大部分情况下,我们不推荐使用这样的形式,因为我们不知道*具体是什么名字,很可能会覆盖掉前面定义的名字。

    四、模块的查找顺序

      python中引用模块是按照一定的规则以及顺序去寻找的,这个查询顺序为:先从内存中已经加载的模块进行寻找,找不到再从内置模块中寻找,内置模块如果也没有,最后去环境变量中寻找,它只会按照这个顺序从这些指定的地方去寻找,如果最终都没有找到,那么就会报错。

      在第一次导入某个模块时,会先检查该模块是否已经被加载到内存中(当前执行文件的名称空间对应得内存),如果有就直接引用(python解释器在启动时会自动加载一些模块到内存中,可以使用sys.modules查看),如果没有,解释器则会查找同名的内置模块。如果还没有找到就在环境变量中找。需要注意的是:我们自定义的模块名不应该与系统内置模块重名。

    #在初始化后,python程序可以修改sys.path,路径放到前面的优先于标准库被加载。
    ​
    > > > import sys
    > > > sys.path.append('/a/b/c/d')
    > > > sys.path.insert(0,'/x/y/z') #排在前的目录,优先被搜索
    > > > 注意:搜索时按照sys.path中从左到右的顺序查找,位于前的优先被查找,sys.path中还可能包含.zip归档文件和.egg文件,python会把.zip归档文件当成一个目录去处理,
    ​
    #首先制作归档文件:zip module.zip foo.py bar.py 
    import sys
    sys.path.append('module.zip')
    import foo,bar
    ​
    #也可以使用zip中目录结构的具体位置
    sys.path.append('module.zip/lib/python')
    ​
    #windows下的路径不加r开头,会语法错误
    sys.path.insert(0,r'C:UsersAdministratorPycharmProjectsa')
    ​
    #至于.egg文件是由setuptools创建的包,这是按照第三方python库和扩展时使用的一种常见格式,.egg文件实际上只是添加了额外元数据(如版本号,依赖项等)的.zip文件。
    ​
    #需要强调的一点是:只能从.zip文件中导入.py,.pyc等文件。使用C编写的共享库和扩展块无法直接从.zip文件中加载(此时setuptools等打包系统有时能提供一种规避方法),且从.zip中加载文件不会创建.pyc或者.pyo文件,因此一定要事先创建他们,来避免加载模块是性能下降。 

    五、相对导入和绝对导入   

      绝对导入必须依据执行文件所在的文件夹路径为准,一个模块只能导入自身的子模块或和它的顶层模块同级别的模块及其子模块。一个模块必须有包结构且只能导入它的顶层模块内部的模块,所以如果一个模块被直接运行,则它自己为顶层模块,不存在层次结构,所以找不到其他的相对路径,所以如果直接运行python xx.py ,而xx.py有相对导入就会报错。

      相对导入格式为from.impot B或者from..A  import B,    .代表当前位置,..代表上层模块,...代表上上层,以后以此类推。相对导入只能在被导入的模块中使用,使用相对导入,就不需要考虑,执行文件到底是谁,只需要知道模块与模块之间的路径关系。

     

    生前无需久睡,死后自会长眠,努力解决生活中遇到的各种问题,不畏将来,勇敢面对,加油,你是最胖的,哈哈哈
  • 相关阅读:
    PyQt5 控件学习(一个一个学习之QCommandLinkButton)
    多任务--线程
    PyQt5 控件学习(一个一个学习之QPushButton)
    PyQt5 控件学习(一个一个学习之QAbstractButton)
    再测我心中的事
    花了两天时间,整理了代码,封装了逻辑
    我现在发现,我写代码有严重的问题
    2014年8月2日0时13分22秒
    2014年8月2日15时13分4秒
    交警与货车司机
  • 原文地址:https://www.cnblogs.com/panshao51km-cn/p/11197089.html
Copyright © 2011-2022 走看看