zoukankan      html  css  js  c++  java
  • 模块简介/模块的导入/模块的查找顺序/绝对导入和相对导入/软件开发目录规范

    一.模块的简介

      什么是模块:

        模块就是一系列功能的结合体

      模块的三种来源:

        1.内置的

        2.第三方的 

        3.自定义的

      模块的四种表现形式:

        1.使用python编写的py文件(也就意味着py文件也可以称之为模块:一个py文件也可以称之为一个模块)(***)
        2.已被编译为共享库或DLL的C或C++扩展(了解)
        3.把一系列模块组织到一起的文件夹(文件夹下有一个__init__.py文件,该文件夹称之为包)(***)
           包:一系列py文件的结合体
        4.使用C编写并连接到python解释器的内置模块

      为什么要使用模块:

        1.用别人的模块可以加快开发效率(内置/第三方)

        2.使用自定义模块,在一个项目中可能会多次使用,这样可以将其放在项目文件夹lib中,将其放在common.py文件中,当别的地方需要时可直接调用

    ps:在调用文件的过程中一定要区分哪个是执行文件,哪个是被导入文件

      双下name方法:在执行文件中__name__=__main__,多用在执行文件中,对执行文件进行测试如:

    if __name__ == '__main__':  # 快捷写法,在pycharm中输入main然后tab键
        index1()
        index2()
    

      如果文件是被当作模块导入的__name__输出为模块名(不加后缀)

    二.模块导入的两种方式

    2.1.导入两种方式:

    1.import+模块名

        右键运行执行文件发生的事(run.py):

          1.首先会创建一个run.py的名称空间

          2.首次导入模块(mk.py)

          3.运行mk.py模块

          4.将mk.py在运行中产生的名字和值存放在mk.py的名称空间中

          5.在执行文件run.py中拿到一个指向mk.py名称空间的名字

        ps:1.首次导入模块会创建名称空间,但是之后再次导入该模块,该模块的名称空间已存在,不会创建新的名称空间了,会沿用第一次导入的结果

             2.当几个模块有相同的部分或者属于同一个模块时可以使用以下句式(不推荐)

    mport+模块名1,模块名2,模块名3....

          当几个模块没有联系的情况下应该分多次导入     

    import+模块名1
    import+模块名2
    ...

          3.当模块的名字很长时,可以给模块取一个别名,如下:这样在在访问模块名称空间下的名字就可以写成kx.名字

    import wohaokuaixina as kx

        使用import打入模块,访问模块下名称空间的名字同意句式:模块名.名字

          特点:1.指名道姓的访问模块中的名字,永远不会与执行文件中的名字冲突

             2.访问模块中的名字必须严格按照句式模块名.名字

    2.from...import....

      右键运行执行文件发生的事(run.py):

          1.首先会创建一个run.py的名称空间

          2.首次导入模块(mk.py)

          3.运行mk.py模块

          4.将mk.py在运行中产生的名字和值存放在mk.py的名称空间中

          5.在执行文件run.py中拿到一个指向mk.py名称空间中某个值的名字

        ps:1.在使用from...import...句式访问模块中的名字不需要加模块名前缀,但是在访问模块中名字可能会产生冲突

           2.可以使用from 模块名 import *的句式将模块中的名字一次性全加载出来(不推荐)

           在这种方式里存在一个方法为__all__,在__all__=[],在列表中可以添加我们需要的名字,这样通过from 模块名 import *读到的名字就是咧白哦种的名字,这样可以限制导入者拿到的名字个数

    三.解决文件循环导入的方法

    3.1循环导入案例:  

      运行文件run.py

    import mi
    m1.f1()
    

      模块m1.py

    print('正在导入m1')
    from m2 import y  # 首次导入m2
    x = 'm1'
    

      模块m2.py

    print('正在导入m2')
    from m1 import x  # 第二次导m1
    y = 'm2'
    

      当运行run.py文件时,名称空间内入下图所示

    3.2解决循环导入的方法一:将循环导入的语句写在最下方

    #m1.py模块
    
    print('正在导入m1')
    x = 'm1'
    from m2 import y  
    
    #m2.py模块
    
    print('正在导入m2')
    y = 'm2'
    from m1 import x
    

      

    3.3解决循环导入的方法二:函数内导入模块

    #m1.py模块
    
    print('正在导入m1')
    def f1():
      from m2 import y,f2
      print('m1.f1>>>y:',y)
      f2()
    x = 'm1'
    
    #m2.py模块
    
    print('正在导入m2')
    def f2():
      from m1 import x
      print('m2.f2>>>x:',x)
    y = 'm2'

    ps:如果在程序中出现循环导入问题,应该想办法取消循环,这应该在程序设计阶段就要避免,实在不行再用此种方式取解决

    四.模块的查找顺序

    4.1查找顺序:

      1.内存

      2.内置

      3.sys.path(相当于环境变量)

    ps:sys.path就相当于一个大列表列表中放了一大推文件路径,第一个文件路径就是执行文件所在的文件夹

    五.模块的绝对导入,相对导入

      绝对导入:绝对导入必须根据执行文件所在的文件夹路径为准,绝对导入无论在执行文件还是被导入文件都可以使用

      相对导入:在相对导入中'.'代表当前路径,'..'代表上一级路径,'...'代表上上级路径.相对导入只能在被导入模块中使用,在使用相对导入时不需要考虑执行文件是谁,只需要考虑模块间的路径关系

    六.软件目录目录规范

      项目根目录:

        1.启动文件夹(bin)--------------start.py文件

    ps:启动文件也可以直接放在项目根目录下

        2.配置文件夹(conf)[不经常改变的变量,IP,PORT,DATABASE]--------------setting.py文件

        3.公共功能文件(lib)[其他文件可能要用到的功能]--------------common.py文件

         4.核心逻辑文件夹(core)--------------src.py文件

         5.日志文件夹(log)--------------log.log日志文件

        6.数据库文件夹(db)

        7.readme文本文件(对软件的介绍)

     

  • 相关阅读:
    更改discuz!3.4注册后用户所在用户组
    APACHE服务器500错误解决方法
    有关redis笔记
    真正免费!!!爱客追剧神器【珍藏】
    discuz 论坛如何设置一个邀请码重复使用不过期,真正管理员专用
    discuz3.4设置会员免回复查看隐藏帖
    BigDecimal的用法详解(保留两位小数,四舍五入,数字格式化,科学计数法转数字,数字里的逗号处理)
    tinyproxy轻量代理服务器安装
    人物-企业家-实业家、发明家:松下幸之助
    图书-励志:《你的梦想一定能实现》
  • 原文地址:https://www.cnblogs.com/z929chongzi/p/11197347.html
Copyright © 2011-2022 走看看