代码改变世界

上海 day14 -- 模块基础和软件开发目录规范

2019-07-16 23:07  在上海的日子里  阅读(251)  评论(0编辑  收藏  举报

目  录

一、模块简介

二、模块的导入方法

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

    循环导入    

    模块的查找顺序

    相对导入和绝对导入

四、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()