模块和软件开发的目录规范
模块的使用
引入
模块:就是一系列功能的集合体
1、模块的分类
模块大致分为四种类别:
(1)一个py文件就是一个模块,文件名叫test.py,模块名叫test
(2)一个包含有__init__.py文件的文件夹称为包,包也是模块
(3)已被编译为共享库或DLL的C或C++扩展
(4)使用C编写并链接到python解释器的内置模块
2、模块的使用
为何要使用模块?
从文件级别组织程序,更方便管理
随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样左程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当作脚本去执行,还可以把它们当作模块来导入到其他的模块中,实现了功能的重复利用
拿来注意,提升开发效率
同样的原理,我们可以下载别人写好的模块然后导入到自己的项目中使用,这种拿来主义,可以极大地提升我们的开发效率
ps:如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写道文件中以便永久保存,需要时就通过python test.py方式去执行,此时test.py被称为脚本script
下面我们介绍关于模块的使用
2.1 import
模块可以包含可执行的语句和函数的定义,这些语句的目的时初始化模块,它们只在模块名第一次遇到导入import语句时才执行(import语句时可以在程序中的任意位置使用的,且针对同一个模块很import多次,为了防止你重复导入,python的优化手段是:第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载到内存中的模块对象增加了一次引用,不会重新执行模块内的语句)
2.2from...import...
from...import...的对比
唯一区别就是:使用from...import...则时将spam中的名字直接导入到当前的名称空间中,所以在当前名称空间中,直接用名字就可以了,无序加前缀:spam.
from...import...的方式有哈出也有坏处
好处:使用起来方便
坏处:加大了名字重复的可能性
3、模块的搜索路径与优先级
模块的查找顺序时:内存中已经加载的模块->内置模块->sys.path路径中包含的模块
sys.path环境变量 解决模块导入问题
软件开放的目录规范
bin 可执行程序
start.py
from core import src
src.run()
conf 配置文件
#settings.py
import os
BASE_DIR=os.path.dirname(os.path.dirname(__file__))
LOG_PATH=r'%s\log\access.log'%(BASE_DIR)
func_dic = {}
core 核心
#src.py
from lib import common
from conf import settings
@common.outter(1,'取款')
def withdraw():
print('正在取款...')
@common.outter(2,'转账')
def transfer():
print('正在转账...')
common.log_time('转账1000万')
@common.outter(3,'查询余额')
def check_balance():
print('查询余额...')
@common.outter(4,'存款')
def save():
print('正在存款...')
# @outter(5,'退出')
# def exit():
# pass
def run():
while True:
print('欢迎使用中国银行ATM自动存取款机'.center(50, "="))
for k,v in settings.func_dic.items():
print('%s : %s'%(k,v[0]))
chioce=input('请输入命令编号q退出:')
if chioce in settings.func_dic:
settings.func_dic[chioce][1]()
elif chioce=='q':
break
else:
print('输入错误请重新输入')
db 数据
lib 库-模块
#common.py
import time
from conf import settings
def log_time(msg):
with open(('%s'%(settings.LOG_PATH)),mode='at',encoding='utf-8')as f:
f.write('%s%s\n' %(time.strftime('%Y-%m-%d %H:%M:%S'),msg))
def outter(n,msg):
def wrapper(func):
#添加记录
settings.func_dic[str(n)]=[msg,func]
return wrapper
log 日志
#access.log
2021-01-04 23:04:59转账1000万
2021-01-04 23:05:00转账1000万
2021-01-04 23:05:01转账1000万