模块简介及软件开发目录


内容概要

  • 面向过程编程
  • 模块简介
  • 模块的两种导入方式
  • 模块导入的顺序
  • 模块导入拓展
  • 执行文件与模块文件的判断
  • 循环导入

内容详细

一、面向过程编程

面向过程编程好比在设计一条生产线生产流程,有顺序有步骤地执行代码

# 注册功能中的面向过程编程思想
1、获取用户名和密码
2、把数据按照一定格式储存
3、打开文件把储存好的数据写入文件

'''缺点:一旦要修改功能,就需要整体改造(牵一发而动全身)'''

模块简介

# 什么是模块?
	模块是一系列功能的结合体

# 为什么要有模块?
	为了提高开发效率(站在巨人的肩膀上)
    
# 模块的三个来源
	1、内置模块(python自带的模块)
    2、第三方模块(别人写好了发布网上,可以下载使用)
    3、自定义模块(一个py文件可以是一个模块)

# 模块的存在形式
	1、是一个py文件
    2、用c语言编写链接过来的
    3、包好一组模块的包(文件夹)
    	# 包就是多个py文件(模块)的集合
    	'一般包文件夹中会含有__init__文件'
	4、已被编译为共享库或DLL的C或C++扩展


'''以后编写项目遇到一些复杂功能先考虑是否有相应的模块可以调用'''

模块的两种导入方式

# 1、import 模块名

import time

'''要分清楚执行文件和别导入文件'''
# 多次导入相同模块也只会执行一次
# 导入模块内部原理
	1、在内存中开辟执行文件的全局名称空间
    2、运行模块文件,开辟被导入模块文件的全局名称空间
    3、把模块中的变量名和数据都存放在模块的全局名称空间中
    4、在执行文件中产生一个模块名指向模块的全局名称空间
    '''如果需要使用模块的数据,只需要以模块名.变量名获取即可'''





# 多次导入也只会执行一次
# 2、from 文件名 import 模块名
#	 from 模块名 import 模块文件中的变量名

	1、产生执行文件的全局名称空间
    2、执行模块文件,产生模块的全局名称空间
    3、将模块中执行之后产生的名字全部存档于模块名称空间中
    4、在执行文件中有一个money指向模块名称空间中的money指向的值

'''
from...import...指名道姓的导入某个名字
    在使用的时候直接写名字即可 但是当当前名称空间有相同名字的时候
    就会产生冲突 使用的就变成了当前名称空间
'''

from db import db_hander

from db_hander import select

模块导入的顺序

1、首先从内存中寻找
2、其次从内置模块中找
3、最后在sys.path的系统路径中找(自定义模块)

'''注意在给自定义模块起名字时,不要命名跟内置模块一模一样的名字,不然python默认优先在内置模块中导入模块'''



import time
import m3

def test():
    time.sleep(10)
    m3.index()

test()

'''开始执行test函数之后,就算再沉睡等待的10秒期间把m3模块删掉了,还是可以打印m3中的index函数的,因为当test函数开始执行时,m3的数据已经加载到了内存,临时把硬盘中m3文件删除,内存中m3的数据还是存在的'''


# sys.path
显示当前文件导入模块时会寻找的文件路径,存放在列表中,第一个路径就是当前文件的存在路径

import sys
print(sys.path)


['D:\\ATM-TRAIN\\ATM3\\core', 'D:\\ATM-TRAIN\\ATM3', 'D:\\pycharm-profession\\PyCharm 2021.1.3\\plugins\\python\\helpers\\pycharm_display', 'C:\\Users\\limeixiang\\.virtualenvs\\pytxt-03w0UXQ8\\Scripts\\python36.zip', 'D:\\Python36\\Lib', 'D:\\Python36\\DLLs', 'D:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\Python36_64', 'C:\\Users\\limeixiang\\.virtualenvs\\pytxt-03w0UXQ8', 'C:\\Users\\limeixiang\\.virtualenvs\\pytxt-03w0UXQ8\\lib\\site-packages', 'D:\\pycharm-profession\\PyCharm 2021.1.3\\plugins\\python\\helpers\\pycharm_matplotlib_backend']

模块导入拓展

# 1、给导入的模块取别名,方便调用

import indexxxxxxx as i

i.index()



# 2、连续导入
'''如果是连续导入多个模块,一般这几个模块是一系列功能相似的,如果不是建议分开导入'''

import time
import os

from index import read1, read2, read3



# 3、导入文件中所有的功能 *


from index import *

idex.read1()
index.read2()


但是模块中如果有希望不被获取的苏数据,可以把它缩进在以下语句中

if __name__ == '__main__':
    def index1():
		pass
    index2():
        pass

执行文件与模块文件的判断

在py文件中打印
print(__name__)

如果当前文件是执行文件,会打印一个'__main__'
如果当前文件是被导的模块文件,会打印当前文件名

from core import src
if __name__ == '__main__':
    src.run()

这个语句一般是在启动文件中

循环导入

# m1文件

print('from m1')

from m2 import y

x = 2


# m2文件

print('from m2')

from m1 import x

y = 1


# 循环导入文件

import m1

'''会报错,因为在导入对方的变量名时,都还没开始定义x,y'''


# 补救方法
1、把定义的x和y放在导入语句的前面,这样可以在对方导入之前就先定义好

print('from m1')
x = 2

from m2 import y


print('from m2')
y = 1

from m1 import x



2、把导入语句封装在函数中,这样,不调用函数时是不会执行函数代码

print('from m1')

def idnex1():
    from m2 import y

x = 2

绝对导入

'''在程序文件中出现多个文件之间导入模块的情况时,导入路径始终以执行文件所在的路径为准'''
按照执行文件所在的sys.path查找模块

以以下图片中的文件目录为例
1、start.py是执行文件,它所在的路径是  D:\ATM-TRAIN\ATM3
2、start.py作为执行文件可以启动 core 文件下的 src.py文件
3、src.py作为被导入文件,它要导入的模块都要在执行文件路径 D:\ATM-TRAIN\ATM3 基础上导入

相对导入

句点符:
	.    表示当前文件所在的路径
    ..   表示上一层文件所在的路径
    
# 打破始终以执行文件路径为准的规则,只考虑两个文件之间的位置
'''只能在模块文件之间使用,不可以在执行文件中使用'''

软件开发目录规范

bin
	放置程序启动文件(当启动文件很少甚至只有一个时,可以直接写在外面
    	run.py(start.py)
lib
	放置程序中各个文件都会使用到的公共方法
    	common.py
conf
	放置配置信息(程序中的'常量')比如路径信息
    	settings
log
	放置日志文件
    	logs.py
core
	用户视图层,放置程序中的核心业务代码
    	src.py
db
	数据处理层,放置用户数据和数据处理文件
    	user_db(文件)
        db_hander.py
readme.md
	程序说明文件,填写使用说明或者广告
    
requirements.txt
	存放项目所需要用到的第三方模块以及版本号