• 模块、包、模块的导入、跨文件导入、软件开发目录规范


    一、模块

      一系列功能的集合体,分为三大类:

        1.内置的模块

        2.第三方的模块

        3.自定义的模块:一个python文件就是一个模块,文件名m.py, 模块名叫m。

        模块的四种形式:

        1..py文件

        2. 已经被编译为共享库或者DLL的C或者C++扩展

        3.把一系列模块组合到一起的文件夹(文件下有一个__init__.py文件,该文件称之为包)

        4.使用C编写并连接到python解释器的内置模块

    二、自定义模块的使用

      1.首次导入自定义模块时会执行自定义模块所在的文件,创建相应的文件名称空间,

      ***应用模块时,需要操作(文件名.功能)***;

      ***无论是查看还会修改都是以原模块为基准,与调用位置无关***

      导入模块规范

      1.导入内置模块

      2.导入第三方模块

      3.导入自定义模块

     三、python 文件的两种用途

    1.当做程序导入,

    2.当做模块导入,没有被引用时就被回收了

    import 导入模块,使用时必须加前缀   "模块名.":

    优点:肯定不会和当前名称空间的名字冲突

    缺点:加前缀显得麻烦

        解决办法:from  模块存放的文件名  import  模块名

          优点:代码更加精简

          缺点:容易与当前名称空间混淆

    import导入模块发生的三件事:

      1、执行源文件代码

      2、产生一个新的名称空间用于存放源文件执行过程中产生的名字

      3、在当前执行文件所在的名称空间中得到一个名字foo,该名字指向新创建的模块名称空间,若要引用模块名称空间中的名字,需要加上该前缀。

    四、循环导入问题

        指的是在一个模块加载/导入的过程中导入另外一个模块,而在另外一个模块中又返回来导入第一个模块中的名字,由于第一个模块尚未加载完毕,所以引用失败、抛出异常,究其根源就是在python中,同一个模块只会在第一次导入时执行其内部代码,再次导入该模块时,即便是该模块尚未完全加载完毕也不会去重复执行内部代码

    五、模块导入的先后顺序  

    查看查找路径方法

    import sys
    print(sys.path)

    先从内存找,再从硬盘找。

    sys.modules查看已经加载到内存中的模块

    import sys
    print(sys.modules)

       包跨文件的调用(处理好环境变量):

      如果模块和当前运行文件不再同意目录下,导入模块操作方法

    import sys
    sys.path.append(r'模块路径')
    import 模块
    from pool.run imort 模块

     把文件路径改成动态

    # 把项目的根目录加入到环境变量中
    import sys
    import os
    sys.path.append(r'绝对路径')
    # 改成动态
    __file__ # 当前文件的绝对路径
    import os
    BASE_DIR=os.path.dirname(os.path.dirname(__file__))
    __file__ # 当前文件的绝对路径
    import os
    BASE_DIR=os.path.dirname(os.path.dirname(__file__))
    sys.path.append(BASE_DIR)
    # 路径拼接
    import os
    BASE_DIR = os.path.dirname(os.path.dirname(__file__))
    LOG_PATH=r'%s/log/user.log'%BASE_DIR

       模块编写规范

        1.文档描述

        2.导入的模块

        3.定义全局变量

        4.定义类,做好注释

        5.定义函数,做好注释

    六、包(就是模块)

      就是一个含有__init__.py文件的文件夹,文件夹内可以放子模块和子包

        包是模块的一种,而包以及包内的模块都是被用来导入使用的。

        首次导入包做的三件事:

          1、执行包下的__init__.py文件

          2、产生一个新的名称空间用于存放__init__.py执行过程中产生的名字

          3、在当前执行文件所在的名称空间中得到一个名字pool,该名字指向__init__.py的名称空间,例如http://pool.xxx和pool.yyy中的xxx和yyy都是来自于pool下的__init__.py,也就是说导入包时并不会导入包下所有的子模块与子包

    包的导入:

      绝对导入,以顶级包夹作为起始

    import pool.m1 from f1

    强调!!!!

        1.关于包相关的导入语句也分为import和from ... import ...两种,但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:凡是在导入时带点的,点的左边都必须是一个包,否则非法。可以带有一连串的点,如import 顶级包.子包.子模块,但都必须遵循这个原则。但对于导入后,在使用时就没有这种限制了,点的左边可以是包,模块,函数,类(它们都可以用点的方式调用自己的属性)。

        2、包A和包B下有同名模块也不会冲突,如A.a与B.a来自俩个命名空间

        3、import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件

      相对导入:.代表当前文件所在的目录,..代表上一层文件夹   【仅限于包内使用,不能跨包(包内模块之间的导入,推荐使用相对导入)】

       

    七、软件开发的目录规范

      1.可读性高

      2.可维护性高

    Foo/
    |-- core/
    |   |-- core.py
    |
    |-- api/
    |   |-- api.py
    |
    |-- db/
    |   |-- db_handle.py
    |
    |-- lib/
    |   |-- common.py
    |
    |-- conf/
    |   |-- settings.py
    |
    |-- run.py
    |-- setup.py
    |-- requirements.txt
    |-- README

     解释:

    ​ • core/: 存放业务逻辑相关代码

    ​ • api/: 存放接口文件,接口主要用于为业务逻辑提供数据操作。

    ​ • db/: 存放操作数据库相关文件,主要用于与数据库交互

    ​ • lib/: 存放程序中常用的自定义模块

    ​ • conf/: 存放配置文件

    ​ • run.py: 程序的启动文件,一般放在项目的根目录下,因为在运行时会默认将运行文件所在的文件夹作为sys.path的第一个路径,这样就省去了处理环境变量的步骤

    ​ • setup.py: 安装、部署、打包的脚本。

    ​ • requirements.txt: 存放软件依赖的外部Python包列表。

    ​ • README: 项目说明文件。

    除此之外,有一些方案给出了更加多的内容,比如LICENSE.txt,ChangeLog.txt文件等,主要是在项目需要开源时才会用到,请读者自行查阅。

  • 相关阅读:
    OAuth 2.0 访问新浪、腾讯的资源服务器
    OAuth 2.0 Authorization Code授权方式详解
    linux权限补充:rwt rwT rws rwS 特殊权限
    异步服务器框架设计
    vsftpd常规操作指南
    folly学习心得
    中国人口趋势(19902035)
    hbase系统搭建
    过载保护
    穷人和富人
  • 原文地址:https://www.cnblogs.com/Holmes-98/p/14304909.html
Copyright © 2020-2023  润新知