其他分享
首页 > 其他分享> > 绝对与相对导入与软件开发目录规范

绝对与相对导入与软件开发目录规范

作者:互联网

     今日内容


绝对导入与相对导入

1.绝对导入

不管是绝对导入还是相对导入只要涉及到导入都是要看执行文件在哪

绝对导入就是以执行文件所在的sys.path为起始路径,往下一层一层的找

1 # 现在这个是执行文件    文件夹名字为xxx 模块名是 a.py
2 '''
3 如果导入的模块文件路径于执行文件的路径不在一个文件夹下
4 我们想要导入这个文件有两种方法
5 可以把导入的模块路径加入sys.path中
6 也可以使用from import
7 '''
8 from xxx import a  # 这个就是绝对导入

如果是多个文件夹下也可以使用from import语句

1 # 现在有个文件夹里面还有还套着两个文件夹最后一个文件夹中有模块名为a.py
2 
3 # 我们也可以使用from import语句
4 
5 from aaa.bbb.ccc import a
6 
7 # 我们就可以使用a中的所有的功能了

如果一个文件夹下有两个模块文件 执行文件不在这个文件夹下

# a模块
print('from a')
from xxx import b

##############################

# b模块
print('from b')

##############################

# 执行文件
import a

# 绝对导入要看执行文件所在的路径在哪 我们要把绝对路径给找到才行

由于pycharm会把我们把项目的根目录自动添加到sys.path中

所以查找模块肯定不会报错的方法就是永远从根目录开始往下一层一层的找

但是如果其他人不是用pycharm运行代码的话那么我们就需要自己手动把

项目的根目录添加到sys.path中(会有一个模块会帮我们自动获取根目录>>>os模块)

相对导入

关于了解相对导入之前我们要知道一个小知识

  . 在路径中的意思是当前路径

  .. 在路径中的意思是上一层路径

  ../.. 在路径中的意思是上上层路径

相对导入其实是在模块与模块之间导入的,

因为一个执行文件可以有多个模块文件而如果模块中导入其他模块的话

也可以相对导入

当文件夹下有两个模块名并且其中一个模块要导入b模块

# a模块
print('from a')
from . import b
# 按照 . 的形式找到a的当前文件路径就可以找到b文件前提是(b和a是在同一个文件夹下) 

##############################

# b模块
print('from b')

##############################

# 执行文件
import a

# 这样是可以让b导入到a中的而且还不报错
相对导入可以不用参考执行文件所在路径 直接以当前模块文件路径为准
  1.相对导入只能在模块文件中使用, 执行文件不能使用相对导入
  2.相对导入如果实在项目比较复杂的情况下 可能会出错
所以相对导入尽量少用 推荐使用绝对导入

 

 

包的概念

1.如何理解包

  1.专业的角度:

    就是一个文件夹中有__init__.py文件夹

  2.直观的角度:

    就是一个文件夹里面有许多个py文件

2.包的作用

  包的作用我们可以理解为一个文件夹中存放了多个py文件(模块文件)

  仅仅是为了方便管理模块文件

3.具体使用

包名也是需要用英文这样才能被import使用

可以直接:

  import 包名

导入一个包名其实导入的是__init__文件夹,里面有什么功能你才能使用什么

但是我们也可以跳过__init__文件夹,直接使用包里的其他模块 

  from 包名 import 模块名

其实现再在python3解释器中文件夹中有没有__init__文件夹其实已经不重要了

一个文件夹都可以是一个包 但是为什么还需要在包中写上__init__文件夹名称呢?

那是因为在python2中 包中必须有__init__文件夹 没有的话我们是用不了里面的模块的

所以为了兼容python2我们在创建包时还是需要在包中写上__init__文件夹

编程思想的转变

现在我们在编写代码的时候其实已经经历了三个阶段:

1.小白阶段

  就是在叠堆代码一行一行代码的写下来          单个文件夹

2.函数阶段

  将代码按照需求的不同封装成不同的函数       单个文件夹

3.模块阶段

  根据功能的不同拆分为不同的模块文件           多个文件夹

小白阶段就像把一堆文件都放到c盘中也不分类

函数阶段就像把一推文件都放到c盘中并且分类

而模块阶段就是按照文件的不同功能放到不同的盘

就是为了我们可以方便快捷高效的管理文件

软件开发目录的规范

根据上面的三个阶段  分模块文件多了之后还需要有文件夹

我们所使用的所有程序目录都是有一定的规范的(就是用多个文件夹存放多个不同功能的py文件)

python项目目录中有:

  1.bin文件夹

    里面是存储程序的启动文件         eg:  start.py

  2.conf文件夹

    里面是存储程序的配置文件         eg: settings.py

  3.core文件夹

    里面是存储程序的核心逻辑         eg: src.py

  4.lib文件夹

    里面是存储程序的共同功能文件    eg: common.py

  5.db文件夹

    里面是存储程序的数据文件           eg: userinfo.txt

  6.interface文件夹

    里面式存储程序的接口文件            eg: user.py

  7.log文件夹

    里面是存储程序的日志文件    eg:log.log

  8.readme文件(文本文件)

    里面是存储一些程序的说明、介绍、广告 类似于产品的说明书

  9.requirements.txt文件

    里面是存储程序所需要的第三方模块名称与版本

我们编写软件项目的时候 可以不完全遵守上面的规范

  启动文件可以不用放在bin文件夹中   直接放在项目根目录下

  db文件夹可以被以后的数据库替代

  log文件夹可以被以后专门日志服务替代

 

 

常见的内置模块

 内置模块就是python解释器已经编写好的我们可以直接使用它的功能非常的方便

1.collections模块

我们之前学基本数据类型只有八大类(整型、浮点型、字符串、列表、字典、元祖、集合、布尔值)

现在collectinons模块又为我们提供了更多的数据类型

1.1 namedtuple(具名元祖)

    可以有名字的元祖

 1 from collections import namedtuple
 2 point = namedtuple('坐标', ['x', 'y'])
 3 res1 = point(11, 22)
 4 res2 = point(55, 66)
 5 print(res1, res2)  # 坐标(x=11, y=22) 坐标(x=55, y=66)
 6 
 7 # 也可以不用列表直接使用字符串还可以传三个参数
 8 point = namedtuple('坐标', 'x y z')
 9 res1 = point(11, 22, 33)
10 res2 = point(55, 66, 77)
11 print(res1, res2)  # 坐标(x=11, y=22, z=33) 坐标(x=55, y=66, z=77)

1.2 deque(双端队列)

我们之前所说的队列就是存放数据的时候 先进先出

而双端队列就是可以两边都可以进

 1 from collections import deque
 2 
 3 q = deque()
 4 q.append(11)
 5 q.append(22)
 6 q.append(33)
 7 q.append(44)
 8 print(q)  # deque([11, 22, 33, 44])
 9 # 我们还可以在q的左边添加数据值
10 q.appendleft(555)
11 print(q)  # deque([555, 11, 22, 33, 44])

1.3 OrderedDict(有序字典)

我们之前所了解的字典都是无序的而现在给我们提供了一个有序字典

1 from collections import OrderedDict
2 
3 d = dict([('a', 1), ('b', 2), ('c', 3)])
4 print(d)  # {'a': 1, 'c': 3, 'b': 2} 是无序的 但是我们可以把它变成有序的
5 
6 d1 = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
7 print(d1)  # OrderedDict([('a', 1), ('b', 2), ('c', 3)])
8 
9 # 注意,OrderedDict的Key会按照插入的顺序排列,不是Key本身排序

1.4 defaultdict

快速生成字典

1 d = defaultdict(k1=[], k2=[])
2 print(d)  # defaultdict(None, {'k1': [], 'k2': []})

1.5 Counter(计数器)

from collections import Counter
# 现在有一个很乱的字符串 现在要计算里面每个字符的个数
# 组织成 {'字符':个数, '字符2':个数}
s = 'dahujdhawuiohdio'  # 最开始我们可以使用for循环解决
d = {}
for i in s:
    if i in d:
        d[i] += 1
    else:
        d[i] = 1
print(d)  # {'d': 3, 'a': 2, 'h': 3, 'u': 2, 'j': 1, 'w': 1, 'i': 2, 'o': 2}
# 不过我们现在可以使用计数器来计算
s = 'dahujdhawuiohdio'
res = Counter(s)
print(res)  # Counter({'d': 3, 'h': 3, 'a': 2, 'u': 2, 'i': 2, 'o': 2, 'j': 1, 'w': 1})
# 这样会方便许多
# 只要是能够被for循环的都可以当做参数传入Counter然后计算

2.time模块

时间的三种模式

  1.时间戳    time.time()

  2.结构化时间       time.gmtime()

  3.格式化时间  time.strftime()

2.1 时间戳

就是从1970年0时0分0秒开始到现在总共多少秒了, 运行print(time.time()) 返回的是float类型

2.2 结构化时间

  就是计算机看的懂的时间有九大元素

 

 2.3 格式化时间

  就是人类看的舒服的时间  2022-07-14 17:08:36

%y   两位数的年份表示(00-99)
%Y   四位数的年份表示(000-9999)
%m   月份(01-12)
%d   月内中的一天(0-31)
%H   24小时制小时数(0-23)
%I   12小时制小时数(0-12)
%M   分钟数(0-59)
%S   秒(00-59)
%a   本地简化星期名称
%A   本地完整星期名称
%b   本地简化的月份名称
%B   本地完整的月份名称
%c   本地相应的日期表示和时间表示(e.g Thu Dec 10 09:54:27 2020)
%j   年内的一天(001-366)
%p   本地A.M.或P.M.的等价符
%U   一年中的星期数(00-53)星期天为星期的开始
%w   星期(0-6),星期天为星期的开始
%W   一年中的星期数(00-53)星期一为星期的开始
%x   本地相应的日期表示(e.g 12/10/20)
%X   本地相应的时间表示(e.g 09:58:15)
%Z   当前时区的名称(e.g 中国标准时间)
%%   %号本身

其中最主要的就是  %Y  %m  %d  %H  %M  %S  %X

1 import time
2 
3 print(time.time())  # 1657789972.6291883
4 print(time.gmtime())  # time.struct_time(tm_year=2022, tm_mon=7, tm_mday=14, tm_hour=9, tm_min=12, tm_sec=13, tm_wday=3, tm_yday=195, tm_isdst=0)
5 print(time.strftime('%Y-%m-%d %H:%M:%S'))  # 2022-07-14 17:12:13
6 print(time.strftime('%Y-%m-%d %X'))  # 2022-07-14 17:12:13
7 # 时间获取的是当前运行文件时的时间

这三者可以互相转换

几种格式的之间的转换

2.3.1 时间戳转结构化时间

# time.gmtime(时间戳)    # UTC时间 与英国伦敦当地时间一致
# time.localtime(时间戳) # 当地时间例如我们现在在北京执行这个方法:与UTC时间相差8小时 UTC时间+8小时 = 北京时间
print(time.gmtime(1657789972))  
# time.struct_time(tm_year=2022, tm_mon=7, tm_mday=14, tm_hour=9, tm_min=12, tm_sec=52, tm_wday=3, tm_yday=195, tm_isdst=0)
print(time.localtime(1657789972))  
# time.struct_time(tm_year=2022, tm_mon=7, tm_mday=14, tm_hour=17, tm_min=12, tm_sec=52, tm_wday=3, tm_yday=195, tm_isdst=0)

2.3.2 结构化时间转时间戳

# 结构化时间转时间戳
# time.mktime(结构化时间)
time_tuple = time.localtime(1657789972)
print(time.mktime(time_tuple))  # 1657789972.0

2.3.3 格式化时间转结构化时间

print(time.strptime('2022-07-14 17:12:13', '%Y-%m-%d %H:%M:%S'))  
time.struct_time(tm_year=2022, tm_mon=7, tm_mday=14, tm_hour=17, tm_min=12, tm_sec=13, tm_wday=3, tm_yday=195, tm_isdst=-1)

2.3.4 结构化时间转格式化时间

print(time.strftime('%Y-%m-%d %X'))  # 2022-07-14 17:22:07
print(time.strftime("%Y-%m-%d", time.localtime(1657789972)))  # 2022-07-14

 

标签:tm,软件开发,导入,文件夹,模块,time,print,目录
来源: https://www.cnblogs.com/stephenwzh/p/16478886.html