【python基础】第24回 包和软件开发规范


目录

本章内容概要

1.绝对导入与相对导入
2.包的概念
3.编程思想的转变
4.软件开发目录规范‘
5.常见内置模块

本章内容详解

1. 绝对导入与相对导入

1.1 导入

  1. 只要涉及到模块的导入,那么sys.path 永远以执行文件为准

1.2 代码推导

  1. 模块之间可以导其他模块
    image
  2. 任何模块中,只要涉及到模块的导入,那么查找路径都是按照执行文件为准
    image
  3. 绝对导入
    image
  4. 多层文件导入
    image
  5. 相对导入
    image

1.3 绝对导入

  1. 以执行文件所在的sys.path为起始路劲 往下一层层查找
# 如
from ccc import b
from ccc.ddd.eee import b
  1. 由于phcharm会自动将项目根目录添加到sys.path中所以查找模块肯定不报错的方法就是永远从根路劲往下一层层找
  2. 如果不是用pycharm运行,则需要将项目跟目录添加到sys.path(针对项目的根目录的绝对路劲有模块可以帮助我们获取:os模块)

1.4 相对导入

  1. 储备知识
    .在路径中意思是当前路经
    ..在路劲中的意思是上一层路经
    ../..在路劲中意思是上上一层路径
  2. 相对导入可以不参考执行文件所在的路径,直接以当前模块文件路径为准
    只能在模块文件中使用,不能在执行文件中使用
    相对导入在项目比较复杂的情况下可能会出错
  3. 相对导入尽量少用,推荐使用绝对导入

2. 包的概念

2.1 如何理解包

  1. 专业的角度:内部含有__init__.py的文件夹
  2. 直观的角度:就是一个文件夹

2.2 包的作用

  1. 内部存放多个py文件(模块文件) 仅仅是为了2更加方便的管理模块

2.3 具体使用

  1. import 包名
  2. 导入包名其实导入的是里面的__init__.py文件(该文件里面有什么你才能用什么)
  3. 也可以跨过__init__.py直接导入包里面的模块文件
  4. 针对python3解释器,其实文件夹里面有没有__init__.py已经无所谓了,都是包
  5. 针对python2解释器,文件夹下面必须有__init__.py才能被当做包

3. 编程思想的转变

3.1 小白阶段

  1. 按照需求从上往下堆叠代码(面条版) 单文件模式
  2. 相当于将所有的文件全部存储在C盘并且不分类

3.2 函数阶段

  1. 将代码按照功能的不同封装成不同的函数 单文件模式
  2. 相当于将所有文件在C盘下分类存储

3.3 模块阶段

  1. 根据功能的不同拆分不同的模块文件 多文件模式
  2. 相当于将所有的文件按照功能的不同分别分类到不同的盘中,目的为了更加方便快捷高效的管理资源
  3. 分模块文件多了之后还需要有文件夹

4. 软件开发目录规范

  1. 我们所使用的所有程序目录都有一定的规范,有多个文件夹
    image

4.1 bin文件夹

  1. 用于存储程序的启动文件 start.py

4.2 conf文件夹

  1. 用于存储程序的配置文件 settings.py

4.3 core文件夹

  1. 用于存储程序的核心逻辑 src.py

4.4 lib文件夹

  1. 用于存储程序的公共功能 common.py

4.5 db文件夹

  1. 用于存储程序的数据文件 userinfo.txt

4.6 log文件夹

  1. 用于存储程序的日志文件 log.log

4.7 interface文件夹

  1. 用于存储程序的接口文件 user.py order.py goods.py

4.8 readme文件(文本文件)

  1. 用于编写程序的说明,介绍,广告,类似于产品说明书

4.9 requirements.txt文件

  1. 用于存储程序所需的第三方模块名称和版本

4.10 总结

  1. 编写软件的时候 可以不完全遵循上面的文件名
  2. start.py可以放在bin文件夹下也可以直接放在项目根目录
  3. db文件夹等我们学到真正的项目会被数据库替代
  4. log文件夹等我们学到真正的项目会被专门的日志服务替代

5. 常见内置模块

5.1 collections模块

  1. 在内置数据类型(dict,list,set,tuple)的基础上,collections模块还提供几个额外的数据类型:Counter,deque,defaultdict,namedtuple,OrderdDict等
  2. namedtuple 生成可以使用名字来访问元素内容的tuple,二维坐标系和三维坐标系
from collections import namedtuple
Point = namedtuple('二维坐标系',['x','y'])
res1 = Point(1,2)
res2 = Point(3,4)
print(res1, res2)
print(res1.x)
print(res2.y)

image

from collections import namedtuple
Point = namedtuple('三维坐标系','x y z')
res1 = Point(1,2,3)
res2 = Point(3,4,5)
print(res1, res2)
print(res1.x)
print(res2.y)
print(res2.z)

image
3. deque 高效实现插入和删除操作的双向列表,适合用于队列和栈

from collections import deque
q = deque()
q.append(11)
q.append(22)
q.append(33)
q.appendleft(44)
print(q)

image
4. OrderedDict 有序字典,Key会按照插入的顺序排列,不是Key本身排序

from collections import OrderedDict
a = dict([('a', 1), ('b', 2), ('c', 3)])
b = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
print(b)

image
5. Counter 目的是用来跟踪值出现的次数

from collections import Counter
c = Counter('abcdeabcdabcaba')
print(c)

image

5.2 时间模块

  1. 表示时间的三种格式
    时间戳,结构化时间,格式化时间
  2. 时间戳 timetime() 时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量
import time
print(time.time())  # 1657791294.936325
  1. 结构化时间 time.gmtime()
import time
# print(time.time())  # 1657791294.936325
print(time.gmtime())  # time.struct_time(tm_year=2022, tm_mon=7, tm_mday=14, tm_hour=10, tm_min=59, tm_sec=19, tm_wday=3, tm_yday=195, tm_isdst=0)
  1. 格式化时间 time.strftime() %Y-%m-%d %H-%M-%S
import time
# print(time.time())  # 1657791294.936325
# print(time.gmtime())
print(time.strftime('%Y-%m-%d %H-%M-%S'))  # 2022-07-14 19-00-56
  1. 转换
    image
  2. 图表
    image

原创文章,作者:745907710,如若转载,请注明出处:https://blog.ytso.com/274364.html

(0)
上一篇 2022年7月14日
下一篇 2022年7月14日

相关推荐

发表回复

登录后才能评论