zoukankan      html  css  js  c++  java
  • 上海 day14 -- 模块基础和软件开发目录规范

    目  录

    一、模块简介

    二、模块的导入方法

    三、模块的导入的几种方式

        循环导入    

        模块的查找顺序

        相对导入和绝对导入

    四、Python文件的两种用途

        引出__name__用法

    五、软件开发目录规范

    一、模块基础简介

    什么是模块?

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

      模块的三种来源:1、python解释器内置的  2、第三方模块(别人写的) 3、自定义模块(自己写的模块)

      模块的四种表现形式:

        1、用python编写的.py文件(一个py文件就是一个模块)

        2、由多个py文件组合在一起的文件夹(注意:文件夹中有__init__.py文件的话,该文件夹叫做“包”)

          包:一系列py文件的结合体。

        3、用C语言编写并连接到python解释器中内置的模块。

        4、已编译为共享库或DLL的C或C++扩展(了解)

    为什么要用模块?

      1、可以调用其他人写的模块来完成某项功能,可以提高开发效率;

      2、自己写的项目有的功能可能需要多个py文件来存储,当其他文件都需要某个方法时可以将它写入一个py文件,

        其他文件以模块的形式调用它。

    如何用模块?

    (******)使用模块时,一定要分清哪个是执行文件,哪个是被导入文件。

    二、模块的导入方法

    import 方法

    在执行文件中以import + 模块名方式导入模块,会发生以下几件事:

      1、首先在执行文件run.py内生成一个run.py的名称空间:

        首次导入模块(md.py)******

        a. 执行md.py 文件,生成md.py的名称空间

        b. 运行md.py 中的代码并将产生的名字丢入md.py的名字空间

        c. 在执行文件中会产生一个指向md.py名称空间的名字md

      2、多次导入时不会执行md.py 文件,会沿用第一次导入的结果    ******  

      

    调用模块中名字的取值方法:

    # 访问模块中的名字指向的值
    # print(md.money)  # 使用import导入模块 访问模块名称空间中的名字统一句势:模块名.名字

    关于import导入模块的方法总结如下:

    使用import导入模块 访问模块名称空间中的名字统一句势:模块名.名字
        1.指名道姓的访问模块中的名字 永远不会与执行文件中的名字冲突
        2.你如果想访问模块中名字 必须用模块名.名字的方式
    """
    
    """
    只要当几个模块有相同部分或者属于用一个模块,可以使用上面的方法
    当几个模块没有联系的情况下 应该分多次导入
    import os
    import time
    import md
    ps:通常导入模块的句式会写在文件的开头
    """
    
    """
    当模块名字比较复杂的情况下 可以给该模块名取别名
    """

    调用被导入模块内的函数时,需要注意:

    1.只要你能拿到函数名 无论在哪都可以通过函数加括号来调用这个函数(会回到函数定义阶段 依次执行代码)
    2.函数在定义阶段 名字查找就已经固定死了 不会因为调用位置的变化而改变

    from ... import ... 方法

    执行文件 run1.py     导入文件md1.py

    以from...import...方法导入模块时,会发生以下几件事:

      1、首先在执行文件run1.py 内生成一个run1.py的名称空间:

        首次导入md1.py文件:

        a. 执行md1.py文件,生成md1.py的名称空间

        b. 运行md1.py内的代码并将产生的变量名字或函数名字丢进md1.py的名称空间

        c. 直接拿到md1.py 名称空间中某个值的名字,也就是from...import...后面的名字

      2、多次导入该模块不会多次执行,会沿用第一次导入的结果。

    from...import...方法导入模块总结如下:

     from...import...使用模块中的名字,直接写名字就可以访问
                可能会与当前执行文件中的名字冲突
                x = 1
                from md import x
                print(x)  模块md中的x
    
    
                from md import x
                x = 1000
                print(x)  当前文件中的x

    补充知识点:

     知识点补充
                from md import *  不推荐使用 消耗资源过多
    
                __all__ = ['','','']  当__all__所在的文件被当做模块导入的时候
                ___all__列表写什么 执行导入语句那个文件就能拿到什么
                __all__不写的情况下 默认是将所在文件所有的名字都暴露给导入者
    
    
                __name__当__name__所在的文件被当做执行文件执行的时候__name__的值就等于__main__
                当__name__所在的文件被当做模块导入的时候__name__的值就等于模块名(py的文件名 不加后缀)
    
            if __name__ == '__main__':
                启动代码/测试代码
    
            pycharm中可以写main+tab自动补全上面的格式

    三、模块的导入的几种方式

    循环导入:就是你导入了我,我导入了你

    出现循环导入首先要想到的是程序设计不合理,要避免循环导入的出现。

    解决循环导入的方法:

    1.解决循环导入方式1
       将循环导入的语句放在要导入的名字的语句下方
    2.解决循环导入方式2
       将导入语句写到函数体代码内(利用函数在定义阶段只检测语法不执行代码)
    3.解决循环导入方式3(******)
       将循环导入的名字 放到另外一个文件中

    模块的查找顺序:

        模块的查找顺序
                1.先在内存中找
                2.内置
                3.system path(程序的环境变量)
    
                    查找模块的路径以执行文件所在的文件夹为准
                    demo
                        -dir
                            --md.py
                        -run.py
                    第一种导入:基于当前执行文件所在文件夹路径依次往下找
                    第二种导入:直接将你需要导入的那个模块所在的文件夹路径添加到system path中

    相对导入和绝对导入

    绝对导入与相对导入
            绝对导入写的就是全路径  该全路径以执行文件所在的文件夹路径为基准
            相对导入
                .代表当前路径
                ..代表上一级路径
                ...代表上上一级路径
    
                注意相对导入只能在模块文件中使用,执行文件中不能使用相对导入
                一般情况下项目只会有一个执行文件,项目的其他文件其实都是模块
                所以相对导入的应用场景也是很广泛

    四、Python文件的两种用途

    Python文件主要有两种用途:

      1、脚本,一个文件就是整个程序,用来被执行。

      2、模块,很多功能的集合体,用来被调用。

    当我们写完一个文件的时候肯定会进行功能测试,但是调用该文件的时候又不希望测试的操作被运行,怎么办?

    那么如何区分当前是执行文件还是被导入文件?

      1、当文件被当做执行文件的时候打印__name__ 结果是__main__

      2、当文件被当做模块导入的时候,在执行文件中打印__name__ 结果是__main__

    所以为了文件中的测试操作不被执行,我们可以在文件中执行如下操作:

    if __name__ == '__main__':  # 快捷操作 main+tab键
        index1()
        index2()

    五、软件开发目录规范

    设置软件开发目录规范的目的:

      使项目结构清晰

      便于管理

      方便扩展

    目录规范:

        项目名
            -bin
                --start.py 项目的启动文件(start.py也可以直接放在项目根目录下)
                    import os
                    import sys
                    将项目名所在的路径添加到system path中,如果你是pycharm打开 pycharm会自动将顶级目录路径添加到system path中
                    而一旦你的项目不是用pycharm打开,亦或者是被用户下载到他自己的机器上,你就必须在项目启动之前将路径设置好
                    BASE_DIR = os.path.dirname(os.path.dirname(__file__))
                    sys.path.append(BASE_DIR)
    
                    from core import src
                    if __name__ == '__main__':
                        src.run()
            -conf
                --settings 项目的配置文件
            -core
                --src.py 项目的核心逻辑文件可能不止一个
            -db
                --数据相关的"文件"
            -lib
                --common.py 项目所使用的到的一些公共的功能
            -log
                --项目所有的日志文件(用户的操作,记录,浏览历史...)
            Readme.txt  项目的大致介绍
            start.py (start.py也可以直接放在项目根目录下)

    bin文件夹下,项目启动文件start.py的写法:

     import os
                import sys
                将项目名所在的路径添加到system path中,如果你是pycharm打开 pycharm会自动将顶级目录路径添加到system path中
                而一旦你的项目不是用pycharm打开,亦或者是被用户下载到他自己的机器上,你就必须在项目启动之前将路径设置好
                BASE_DIR = os.path.dirname(__file__)
                sys.path.append(BASE_DIR)
    
                from core import src
                if __name__ == '__main__':
                    src.run()
  • 相关阅读:
    [转]Win7 64位操作系统下配置PHP+MySql+Apache环境
    [转]你必须懂的 T4 模板:深入浅出
    [转]C#反射机制介绍
    [转]RDLC报表,纯文字内容,动态数据源 解决方案
    [转]关于C# 中的Attribute 特性
    [转]MVC中如何使用RDLC报表
    [转]关于用netbeans和xdebug调试php的配置
    1308论文相关时间
    [转].net 使用NPOI或MyXls把DataTable导出到Excel
    [转]MySQL安装总结:Start service没有响应(Win7 64位) 服务启动失败 1067 错误
  • 原文地址:https://www.cnblogs.com/qinsungui921112/p/11198174.html
Copyright © 2011-2022 走看看