1.模块规范
1.一个.py文件的两种用途
1.被当做程序运行
2.被当做模块导入
当foo.py文件当做文件被运行时,__name__=='__main__'
当foo.py文件当做模块被导入时,__name__=='foo'
当编写模块foo.py的内置方法,想要运行测试时:
def get():
print('get')
if __name__ == '__main__':
get()#get
2.from导入
用from方式可以不用加前缀,但容易混淆
from foo import get
get()
3.循环导入
两个模块互相导入,垃圾代码,有致命性的问题
4.模块查找的优先级
1.内存(内置模块)
2.从硬盘找。按照sys.path中存放的文件的顺序依次查找要导入的模块
import sys
print(sys.path)
一个列表,存放了一系列文件夹目录,其中第一个文件夹,是当前执行文件所在的文件夹目录
5.编写模块的规范
1.首先模块的文档描述 2.导入模块(编写此模块需要的其他模块) 3.定义全局变量(如非必要,尽量使用局部变量节省内存) 4.定义类 5.定义函数 6.if __name__ == '__main__': 测试程序()
6.包的使用
1.包就是一个包含有__init__.py文件的文件夹
包的本质就是模块的一种形式,包是用来当做模块导入
在当前目录下,新建一个包(Python Package)mmm,在mmm目录下的__init__.py中:
print('运行了。。。')
x=111
y=222
def func1():
print('xxx')
在其他文件中调用包模块mmm
import mmm
print(mmm.x)
print(mmm.y)
mmm.func1()
# 运行了。。。
# 111
# 222
# xxx
2.为何要有包
多个类和函数,放在一个.py文件中,维护起来麻烦,分类混乱,可维护性差。
模块开发者
在包mmm目录下新建m1.py,在m1.py中:
def func2():
print('66666')
在mmm/__init__.py中引入:
#绝对导入
from mmm.m1 import func2
#相对导入:仅限于包内使用,不能跨出包
#. 代表当前文件夹
#.. 代表上一层文件夹
from .m1 import func2
模块使用者
import sys
sys.path.append(r'F:\S14\day21\mmm')
#将包的绝对路径加入环境,这是暂时加入,在程序执行完就会消除
from mmm.m1 import func2
func2()#66666
如果from后面是带.的,必须要是一个包模块(约定俗成,不这么做也不影响用)
除非开发很大很大的项目,或者以后做开源公益,不然一般很少会自定义包
2.软件开发目录规范
约定俗成的规范,不这么弄也不影响用。
1.项目目录:
# 项目文件夹:(比如ATM)
# 文件夹bin:放一些可执行文件(比如start.py)
# 文件夹conf:放一些配置文件(比如settings.py)
# 文件夹db:放一些操作数据库相关的文件(比如db_handle.py)
# 文件夹lib:放一些项目中常用共享的库文件(比如:common.py)
# 文件夹core:放项目的核心代码逻辑文件(比如:src.py)
# 文件夹api:放一些跟网络传值相关的文件(比如:api.py)
# 文件夹log:放一些一些日志文件(比如:user_log.log)
# 如需安装则需要有安装脚本setup.py
# requirements.txt记录着想要软件项目运行,环境中需要存在的依赖库
# README 软件基本信息
2.新建项目框架(ATM)
1.如图,新建项目目录
2.在bin目录下编写start.py:
import os
import sys
#print(__file__)#当前文件的绝对路径
BASE_DIR=os.path.dirname(os.path.dirname(__file__))#ATM 项目路径
sys.path.append(BASE_DIR)#将ATM项目路径 加入环境变量
from core import src
if __name__ == '__main__':
src.run()
3.让用户可以自定义日志文件存放位置,在log目录下的user_log:
import os
BASE_DIR=os.path.dirname(os.path.dirname(__file__))
LOG_PATH=r'%s\log\user_log'%BASE_DIR
4.记录日志功能属于通用组件,在lib目录下的common.py:
import time
from conf import settings
def logger(msg):
with open(settings.LOG_PATH,mode='at',encoding='utf-8') as f:
f.write('%s %s\n'%(time.strftime('%Y-%m-%d %H-%M-%S'),msg))
5.在core目录下编写主要业务程序src.py:
from lib.common import logger
def login():
print('登录功能')
logger('bob登录了')
def register():
print('注册功能')
logger('bob注册了')
def witdraw():
print('提现功能')
logger('bob提现了')
def transfer():
print('转账功能')
logger('bob转账了')
func_dic={
'0':['退出',exit],
'1':['登录',login],
'2':['注册',register],
'3':['提现',witdraw],
'4':['转账',transfer]
}
def run():
#启动
while True:
for k in func_dic:
print(k,func_dic[k][0])
choice=input('请输入指令编号:').strip()
if choice in func_dic:
func_dic[choice][1]()
else:
print('请重新输入')
运行:
在运行bin目录下的start.py
在log/user_log中: