模块和软件目录规范

今日内容概要

  • 循环导入问题

  • 判断文件类型

  • 模块的查找顺序

  • 绝对导入与相对导入

  • 模块与包(简单)

  • 编程思想的演变

  • 软件开发目录规范

  • 常用内置模块(需要滚瓜烂熟)

     

今日内容详细

强调

以后在工作中项目的文件名肯定都是以英文为主

一、循环导入问题

# 两个文件彼此导入彼此
  循环导入的时候极有可能出现某个名字还没有被创建就使用的情况导致报错的现象
   """所以在以后的编程生涯中 尽量去避免出现循环导入的问题"""
   如果确实需要循环导入 那么需要确保双方使用的名字都必须'提前定义好'
  (一错再错的办法)  循环导入的缺陷:它会让一些代码重复执行
   方法1:将导入模块的句式写在定义名字的下面即可
   方法2:将导入模块的句式写在函数体代码内
   比如:
   name ='from a'
   def index():
       import b
       print(b.name)
   index()

 

 

 

 

二、判断文件类型

# py文件可以被分为两种类型
1.执行文件
2.被导入模块文件

我们在调用该代码时我们只需要该代码的核心功能部分 针对测试部分或其他的代码我们不需要
解决办法:利用__name__

有一个内置变量__name__  
   当__name__所在的文件是执行文件的时候 结果是__main__  如:print(__name__)  # __main__
   当__name__所在的文件是被导入模块文件时候 结果是文件名(模块名)  如:print(__name__)  # md
   
   __name__的作用用法:将代码核心功能与测试部分区分开
   def index():
   print('from index')
def func():
   print('from func')
if __name__ == '__main__':
   # 作为模块开发者 也需要先测试代码能否正常运行
   index()  # 测试代码 可能会很多
   func()   # 测试代码 可能会很多 我们在调用该代码时我们只需要该代码的核心功能部分 针对测试部分或其他的代码我们不需要
   
   可以借助于__name__区分开被导入的代码和测试代码
   if __name__ =='__main__'
   当前文件是执行文件的时候才会执行的子代码块 否则只会出现模块名,函数子代码不会运行
   """"""
   由于上述代码在很多启动脚本中经常使用 所以有简写方式
   直接输入main之后按tap键即可

 

 

 

 

三、模块的查找顺序

"""
1.先从内存空间中查找
2.再去内置模块中查找
3.最后去sys.path查找(类似于我们前面学习的环境变量)
如果上述三个地方都找不到 那么计算机会直接报错
"""
# 先在内存中找
# import md1
# import time
# time.sleep(20) # 睡眠期间将md1文件删除
# print(md1.name)
# 2.验证再从内置模块中查找
# import time   # F:\Python36\python.exe "F:/pythonday 17/03.模块的查找顺序.py" 查找的是模块中的time,而不是py文件中的time.py
# print(time.time()) # 1648197429.7457595
# 强调:在创建py文件时候一定不要跟模块名(内置、第三方)冲突!!!!
# 3.验证sys.path中查找 类似于我们前面学习的环境变量
import sys
print(sys.path)  # 结果是一个列表
#这个路径有什么用? 就是在内存中和内置模块中找不到就去这些路径中一个一个去查找 比如:import md 先去内存中去找 然后再去内置中去找 最后再去路径中一个一个找 直到找到后在加载给内存运行
# ['F:\\pythonday 17', 'F:\\pythonday 17', 'F:\\PyCharm 2020.3.3\\plugins\\python\\helpers\\pycharm_display', 'F:\\Python36\\python36.zip', 'F:\\Python36\\DLLs', 'F:\\Python36\\lib', 'F:\\Python36', 'F:\\Python36\\lib\\site-packages', 'F:\\PyCharm 2020.3.3\\plugins\\python\\helpers\\pycharm_matplotlib_backend']
 # 例题:比如在idea文件内在加一个mddddd.py文件
 import mdddd  # 找不到 首先在内存中找不到 在内置中也找不到 然后找第一个路径只有到idea 无法在继续找到idea下的文件 所以需要注意看文件路径的第一个路径为准 也就是执行文件所在的路径
 # 查找模块时候只需要站在执行文件所在得路径查看即可 路径上有就可以 没有就不行

 # 那么如何解决这个问题呢?
 #方式一:主动添加sys.path路径(类似于添加环境变量)
 # 由于sys.path是一个列表 所以我们可以:
 import sys
 sys.path.append(r'F:\\pythonday 17/idea') # idea的所在路径
 import mdddd
 print(mdddd.name)   # 都是一群傻鸟 这样就能执行mdddd的执行代码
 # 比如在举个例子:
 # 我们在idea下的mdddd.py文件内输入 import md 问是否能找得到? # 答案:显然是找不到的 原因 :因为通过print(sys.path)我们发现mdddd是执行文件 它最多看到的路径就是他的上一级idea的路径 而idea与md是同一级文件 所以他只能找到idea 找不到md
 # 但是在pycharm中 pycharm会自动将项目目录所在的路径添加到sys.path中 如果不借助pycharm软件就找不到
 
 # 方式二:利用from....import.....句式指名道姓的查找
 from idea import mdddd  # 从文件夹idea中导入mdddd模块
 print(mdddd.name)
 
 例题1:
 from.aaa.bbb.ccc import mm # 通过点的方式进入下一层目录
 print(mm.name)
"""如果不在pycharm中执行 如何兼容?"""方法后面目录规范再学

 

 

 

 

四、绝对导入与相对导入

1.在导入模块的时候一切查找模块的句式都是以执行文件为准
  无论导入的句式是在执行文件中还是在被导入文件中!!!!
# 绝对导入
    永远按照执行文件所在的路径一层层往下查找(无脑查找即可)   from bbb.ddd.eee import a  基于当前执行文件
# 相对导入
    相当于导入打破了必须参照执行文件的所在路径的要求 只需要考虑当前模块所在的路径然后使用特殊符号.去查找其他模块即可""""""  from .import a 基于当前导入模块文件  
   相对导入只能在被导入模块文件中使用 不能在执行文件中使用  局限性较大
   """
  预备知识
  .表示当前路径
  ..表示上一层路径
  ../..表示上上一层路径"""
   """"""
   "以后如果想一劳永逸" 那么就只使用绝对导入即可

五、包

# 从专业的角度来解释的话
   包就是内部含有__init__.py的文件夹
# 从实际的角度来解释的话
   包就是多个模块的结合体(内部存放了多个模块文件)
   eg:我们的电脑某个文件夹下面有很多不同类型的文件
       视频文件、音频文件、文本文件、图片文件
       为了方便管理我们会习惯性的创建不同的文件夹分类管理
       学习视频
      J老师视频合集
         R老师视频合集
         C老师视频合集
       学习笔记
      D老师经典语录
         A老师经典语录
      ...
# 在pycharm中甚至直接提供了创建包的选项
   本质就是文件夹里面有一个__init__.py文件
   """"""
   在导入包的时候 索要名字其实是跟包里面的__init__.py要
   1.如果想直接通过包的名字使用包里面所有的模块那么需要在__init__.py中提前导入
   上述方法的好处在于__init__可以提前帮你准备好可以使用的名字
   
   2.也可以直接忽略__init__的存在使用绝对导入即可
      上述方式的好处在于不需要考虑包的存在 直接当成普通文件夹即可
       
 # 包里面的__init__可以看成是你的管家
你可以吩咐它帮你做事 也可以直接架空它自己动手
   

六、编程思想演变

1.小白阶段
   此阶段写代码就是在一个文件内不停的堆叠代码的行数(面条版本)
   
2.函数阶段
   此阶段写代码我们学会了将一些特定功能的代码封装到函数中供后续反复调用
   
3.模块阶段
    此阶段不单单是将功能代码封装成函数 并且将相似的代码功能拆分到不同的py文件中便于后续的管理
  """"""
"为什么要如此演变???"
我们将这个过程形象成使用电脑的过程
   小白阶段相当于在c盘下直接存取各种类型的文件
   
   函数阶段相当于在c盘下创建文件夹管理文件
   模块阶段相当于考虑性能在不同的盘下存档不同的数据
   
   答案:更加方便、快捷、高效的管理资源

七、软件开发目录规范

# 我们实际工作中编写的程序软件都是有很多文件夹和文件组成
  这些文件夹和文件其实都是有各自存在的意义和主要功能
   
   1.bin文件夹
        存放程序的启动文件   start.py
   2.conf文件夹
        存放程序的配置文件    settings.py
   3.core文件夹
        存放程序的核心业务    src.py
        就是最为重要的代码  能够实现具体需求
   4.lib文件夹
        存放程序公共的功能  common.py
   5.db文件夹
        存放程序的数据     userinfo.txt
   6.log文件夹
        存放程序的日志记录  log.log
   7.readme文本文件
        存放程序的说明、广告等额外的信息
   8。requirements.txt文本文件
        存放程序需要使用的第三方模块及对应的版本
       
  """目录的名字可以不一样 但是主要的思想是一致的  
  就是为了便于管理 解耦合
  拿到启动文件之后直接运行即可 无需考虑程序内部的复杂程度 便于管理
  当代码越来越多的时候 你才能体会到拆分的好处"""

 

posted @ 2022-03-25 19:47  一颗平凡的小石头  阅读(58)  评论(0)    收藏  举报