模块简介/模块的导入/模块的查找顺序/绝对导入和相对导入/软件开发目录规范

一.模块的简介

  什么是模块:

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

  模块的三种来源:

    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文本文件(对软件的介绍)

 

原文地址:https://www.cnblogs.com/z929chongzi/p/11197347.html