21.模块规范+软件开发目录规范

本文介绍了Python中的模块和包的概念,包括如何创建和使用模块,模块导入的方式及规范,以及如何管理和组织大型项目的目录结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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中:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值