zoukankan      html  css  js  c++  java
  • 包,软件开发目录规范

    6.10自我总结

    1.包

    1.什么是包

    包是模块的一种形式,包的本质就是一个含有__init__.py的文件的文件夹

    2.为什么用包

    当一个模块功能太多的时候不方便进行管理,我们用包来进行管理

    3.包的使用

    1.导入包发生的三件事

    1. 创建一个包的名称空间

    2. 由于包是一个文件夹,无法执行包,因此执行包下的__init__.py文件,将执行过程中产生的名字存放于包名称空间中(即包名称空间中存放的名字都是来自于__init__.py)且init中文件执行导入文件的路径以运行文件为基准

    3. 在执行文件中使用包内的名称,是指向包的名称空间

    2.包的两种导入方式

    1. import ...
    2. from ... import...

    两种导入方式与模块的相似,只是导入包的时候运行的是包里面的init文件

    3.个人理解包导入的两种方式路径的写法

    关于.的使用,在(from.)是当前目录.(from..)当前文件目录的上一级,.要和from连用才有当前目录,上一级目录说法,(import.)不是当前,import相当于python的环境配置路径
    

    2.软件开发目录规范

    为了提高程序的可读性与可维护性,我们应该为软件设计良好的目录结构,这与规范的编码风格同等重要,简而言之就是把软件代码分文件目录。假设你要写一个ATM软件,你可以按照下面的目录结构管理你的软件代码:

    ATM/
    |-- core/
    |   |-- src.py  # 业务核心逻辑代码
    |
    |-- api/
    |   |-- api.py  # 接口文件
    |
    |-- db/
    |   |-- db_handle.py  # 操作数据文件
    |   |-- db.txt  # 存储数据文件
    |
    |-- lib/
    |   |-- common.py  # 共享功能
    |
    |-- conf/
    |   |-- settings.py  # 配置相关
    |
    |-- bin/
    |   |-- run.py  # 程序的启动文件,一般放在项目的根目录下,因为在运行时会默认将运行文件所在的文件夹作为sys.path的第一个路径,这样就省去了处理环境变量的步骤
    |
    |-- log/
    |   |-- log.log  # 日志文件
    |
    |-- requirements.txt # 存放软件依赖的外部Python包列表,详见https://pip.readthedocs.io/en/1.1/requirements.html
    |-- README  # 项目说明文件
    
    # run.py
    
    import sys
    import os
    
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    sys.path.append(BASE_DIR)
    from core import src
    
    if __name__ == '__main__':  #是导入run的时候不会调用函数
        src.run()
    
    # settings.py
    
    import os
    
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    DB_PATH = os.path.join(BASE_DIR, 'db', 'db.txt')
    LOG_PATH = os.path.join(BASE_DIR, 'log', 'user.log')
    
    # print(DB_PATH)
    # print(LOG_PATH)
    
    # src.py
    
    from conf import settings
    from lib import common
    
    
    def login():
        print('登陆')
    
    
    def register():
        print('注册')
        name = input('username>>: ')
        pwd = input('password>>: ')
        with open(settings.DB_PATH, mode='a', encoding='utf-8') as f:
            f.write('%s:%s
    ' % (name, pwd))
            # 记录日志。。。。。。
            common.logger('%s注册成功' % name)
            print('注册成功')
    
    
    def shopping():
        print('购物')
    
    
    def pay():
        print('支付')
    
    
    def transfer():
        print('转账')
    
    
    func_dic = {
        '1': login,
        '2': register,
        '3': shopping,
        '4': pay,
        '5': transfer,
    }
    
    
    def run():
        while True:
            print("""
            1 登陆
            2 注册
            3 购物
            4 支付
            5 转账
            6 退出
            """)
            choice = input('>>>: ').strip()
            if choice == '6': break
            if choice not in func_dic:
                print('输入错误命令,傻叉')
                continue
            func_dic[choice]()
    
    # common.py
    
    import time
    from conf import settings
    
    
    def logger(msg):
        current_time = time.strftime('%Y-%m-%d %X')
        with open(settings.LOG_PATH, mode='a', encoding='utf-8') as f:
            f.write('%s %s' % (current_time, msg))
    
  • 相关阅读:
    spring注解方式AOP
    struts2 值栈的理解
    JAVA自定义注解
    JS学习随笔。
    使用Jsoup解析html网页
    Struts迭代器(iterator)遍历List常用的4种例子
    Maven 结合 Spring profile对不同的部署环境打包部署
    打印插件LODOP使用介绍
    Linux下查看CPU信息、机器型号等硬件信息
    验证码的生成和验证
  • 原文地址:https://www.cnblogs.com/pythonywy/p/10997626.html
Copyright © 2011-2022 走看看