zoukankan      html  css  js  c++  java
  • 模块和软件开发的目录规范

    模块的使用

    引入

    模块:就是一系列功能的集合体

    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'%slogaccess.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
    ' %(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万
    
  • 相关阅读:
    easy-ui的data-options用法
    my_note
    定时器
    abp安装
    微信小程序
    几个免费的ui 后台
    abp创建实体的方法
    winform 开源项目
    func委托
    for update 锁行和锁表
  • 原文地址:https://www.cnblogs.com/cnblogswilliam/p/14233135.html
Copyright © 2011-2022 走看看