模块与项目开发目录规范



# 今日知识
'''
模块
import 模块的导入
from ...import 导入模块
循环导入
__name__的用法
模块查找的顺序
模块的绝对导入和相对导入
项目开发目录规范
'''


# 一 模块的基础
'''
什么是模块:就是一系列功能的结合体
模块一共分为三种来源:
1.内置模块(python解释器自带的)
2.第三方模块(别人写好的,直接调过来用就可以了)
3.自定义模块(自己手写的)

模块一共有四种表现:
1.使用python编写的py文件 ,就是说py文件也可以称之为模块
2.已被编译为共享库或DLL的C或C++扩展(了解)
3.把一系列模块组织到一起的文件夹(该文件下有一个__init__.py文件,该文件夹被称之为包)
4.使用C编写并连接到Python解释器的内置模块

那么使用模块有什么用:
1.别人的模块或第三方的模块:就是可以把别人的模块调过来自己用,不需要自己在写,极大的提高了效率
2.使用自己自定义的模块:因为当写的程序比较庞大的时候,你不可能都写在一个py文件当中,
可以把一些公共的方法写到一个py文件中,然后其他文件以模块的形式导过去直接调用就可以了

重点:一定要注意区分那个是执行文件,那个是被导入的模块
'''

# 二 import 导入模块
'''
导入模块需要注意的几个点:
1.导入模块的时候如果你多次导入不会在执行魔窟啊文件,只会沿用第一次导入的成果
2.只要你能拿到函数名 无论在哪都可以通过函数加括号来调用这个函数(会回到函数定义阶段 依次执行代码)
3.函数在定义阶段 名字查找就已经固定死了 不会因为调用位置的变化而改变

使用import导入模块 访问模块名称空间中的名字统一句势:模块名.名字
1.指名道姓的访问模块中的名字,永远不会与执行文件中的名字冲突
2.如果你想要访问模块中的名字,必须用模块名 . 名字的方式



当我们到模块的时候不推荐把几个没有联系的模块写在一行导入
import os,time,md
我们应该这样写:
import os
import time
import md
注意:我们通常导模块的时候句式会写在文件最上方

当模块的名字比较复杂的情况下,可以给模块用 as 后面 起别名


'''

# 三 from ... import 导入模块
'''
首先建俩个py文件:
md文件,里面放:
money = 1000
def read1():
print('md',money)
def read2():
print('md模块')
read1()
def change():
global money
money = 0
__all__ = ['money','read1','read2']
在建一个run文件
在run文件import md

他的执行顺序是什么:
首次导入md.py模块
1.运行md.py
2.将产生的名字存放到md.py名称空间中
3.直接拿到指向模块md.py名称空间中某个值的名字


利用from...import...句式
缺点:
1.访问模块中的名字不需要加模块名前缀
2.在访问模块中的名字可能会与当前执行文件中的名字冲突

补充:如果用 from md1 import *
可以一次性将md模块的名字全部加载过来,但是不推荐这样使用,因为你不知道你需要用那些名字

有一个__all__的方法可以指定当前所在py文件被当做模块导入的时候,
我们可以限制导入者能拿到的名字个数

'''

# 四 循环导入以及如何解决循环导入
'''
循环导入是如何导致的
循环导入的问题点:名字没有产生就使用名字
解决循环导入:先产生名字,在导入模块
将会产生循环导入的模块,导入语法延后 - 延后导入

问题
m1.py
import m2
print(m2.y)
x = 666

m2.py
import m1
print(m2.x)
y = 888

解决
m1.py
x = 666
import m2
print(m2.y)


m2.py
y = 888
import m1
print(m2.x)

注:
如果出现了循环导入问题,那么一定是你的程序设计的不合理,
循环导入问题应该在程序设计阶段就应该避免

'''

# 五 __name__的用法
'''
def index1():
print('index1')

def index2():
print('index2')

print(__name__)
当文件被当做执行文件执行的时候__name__打印的结果是__main__
当文件被当做模块导入的时候__name__打印的结果是 模块名(没有后缀)
if __name__=='__main__'
index1()
index2()
快捷写法main直接 tab键即可

'''
# 六 模块的查找顺序
'''
模块的查找顺序
1.先从内存中找
2.内置中找
3.sys.path中找(环境变量):
注意:
1.一定要分清楚谁是执行文件谁是被导入文件
2.py文件名不应该与模块名(内置的,第三方的)冲突

sys.path就是一个大列表,里面放了一堆文件路径,第一个路径永远是执行文件所在的文件夹
'''

# 七 绝对导入与相对导入
'''
绝对导入必须依据执行文件所在的文件路径为准
1.绝对导入无论在执行文件中还是被导入文件都适用


相对导入:
.代表的是当前路径
..代表的是上一级路径
...代表的是上上一级路径

注意:
相对导入不能再执行文件中使用
想对导入只能在被导入的模块中使用,使用相对导入,就不需要考虑
执行文件是谁,只需要知道模块与模块之间的路径关系

注:一般用绝对导入比较多
'''

# 八 项目目录规范

项目名
bin文件夹
start.py项目启动文件

conf文件夹
settings.py项目配置文件

core文件夹
src.py项目核心逻辑文件

db文件夹
数据相关

lib文件夹
common.py项目所用到的公共的功能文件

log文件夹
log.log项目的日志文件

readme文本文件 介绍项目


启动文件的代码
import sys
import os

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
sys.path.append(BASE_DIR)

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




# 今日知识
'''
模块
import 模块的导入
from ...import 导入模块
循环导入
__name__的用法
模块查找的顺序
模块的绝对导入和相对导入
项目开发目录规范
'''


# 一 模块的基础
'''
什么是模块:就是一系列功能的结合体
模块一共分为三种来源:
1.内置模块(python解释器自带的)
2.第三方模块(别人写好的,直接调过来用就可以了)
3.自定义模块(自己手写的)

模块一共有四种表现:
1.使用python编写的py文件 ,就是说py文件也可以称之为模块
2.已被编译为共享库或DLL的C或C++扩展(了解)
3.把一系列模块组织到一起的文件夹(该文件下有一个__init__.py文件,该文件夹被称之为包)
4.使用C编写并连接到Python解释器的内置模块

那么使用模块有什么用:
1.别人的模块或第三方的模块:就是可以把别人的模块调过来自己用,不需要自己在写,极大的提高了效率
2.使用自己自定义的模块:因为当写的程序比较庞大的时候,你不可能都写在一个py文件当中,
可以把一些公共的方法写到一个py文件中,然后其他文件以模块的形式导过去直接调用就可以了

重点:一定要注意区分那个是执行文件,那个是被导入的模块
'''

# 二 import 导入模块
'''
导入模块需要注意的几个点:
1.导入模块的时候如果你多次导入不会在执行魔窟啊文件,只会沿用第一次导入的成果
2.只要你能拿到函数名 无论在哪都可以通过函数加括号来调用这个函数(会回到函数定义阶段 依次执行代码)
3.函数在定义阶段 名字查找就已经固定死了 不会因为调用位置的变化而改变

使用import导入模块 访问模块名称空间中的名字统一句势:模块名.名字
1.指名道姓的访问模块中的名字,永远不会与执行文件中的名字冲突
2.如果你想要访问模块中的名字,必须用模块名 . 名字的方式



当我们到模块的时候不推荐把几个没有联系的模块写在一行导入
import os,time,md
我们应该这样写:
import os
import time
import md
注意:我们通常导模块的时候句式会写在文件最上方

当模块的名字比较复杂的情况下,可以给模块用 as 后面 起别名


'''

# 三 from ... import 导入模块
'''
首先建俩个py文件:
md文件,里面放:
money = 1000
def read1():
print('md',money)
def read2():
print('md模块')
read1()
def change():
global money
money = 0
__all__ = ['money','read1','read2']
在建一个run文件
在run文件import md

他的执行顺序是什么:
首次导入md.py模块
1.运行md.py
2.将产生的名字存放到md.py名称空间中
3.直接拿到指向模块md.py名称空间中某个值的名字


利用from...import...句式
缺点:
1.访问模块中的名字不需要加模块名前缀
2.在访问模块中的名字可能会与当前执行文件中的名字冲突

补充:如果用 from md1 import *
可以一次性将md模块的名字全部加载过来,但是不推荐这样使用,因为你不知道你需要用那些名字

有一个__all__的方法可以指定当前所在py文件被当做模块导入的时候,
我们可以限制导入者能拿到的名字个数

'''

# 四 循环导入以及如何解决循环导入
'''
循环导入是如何导致的
循环导入的问题点:名字没有产生就使用名字
解决循环导入:先产生名字,在导入模块
将会产生循环导入的模块,导入语法延后 - 延后导入

问题
m1.py
import m2
print(m2.y)
x = 666

m2.py
import m1
print(m2.x)
y = 888

解决
m1.py
x = 666
import m2
print(m2.y)


m2.py
y = 888
import m1
print(m2.x)

注:
如果出现了循环导入问题,那么一定是你的程序设计的不合理,
循环导入问题应该在程序设计阶段就应该避免

'''

# 五 __name__的用法
'''
def index1():
print('index1')

def index2():
print('index2')

print(__name__)
当文件被当做执行文件执行的时候__name__打印的结果是__main__
当文件被当做模块导入的时候__name__打印的结果是 模块名(没有后缀)
if __name__=='__main__'
index1()
index2()
快捷写法main直接 tab键即可

'''
# 六 模块的查找顺序
'''
模块的查找顺序
1.先从内存中找
2.内置中找
3.sys.path中找(环境变量):
注意:
1.一定要分清楚谁是执行文件谁是被导入文件
2.py文件名不应该与模块名(内置的,第三方的)冲突

sys.path就是一个大列表,里面放了一堆文件路径,第一个路径永远是执行文件所在的文件夹
'''

# 七 绝对导入与相对导入
'''
绝对导入必须依据执行文件所在的文件路径为准
1.绝对导入无论在执行文件中还是被导入文件都适用


相对导入:
.代表的是当前路径
..代表的是上一级路径
...代表的是上上一级路径

注意:
相对导入不能再执行文件中使用
想对导入只能在被导入的模块中使用,使用相对导入,就不需要考虑
执行文件是谁,只需要知道模块与模块之间的路径关系

注:一般用绝对导入比较多
'''

# 八 项目目录规范
'''
项目名
bin文件夹
start.py项目启动文件

conf文件夹
settings.py项目配置文件

core文件夹
src.py项目核心逻辑文件

db文件夹
数据相关

lib文件夹
common.py项目所用到的公共的功能文件

log文件夹
log.log项目的日志文件

readme文本文件 介绍项目


启动文件的代码
import sys
import os

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
sys.path.append(BASE_DIR)

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


'''
posted @ 2019-07-16 19:44  ZHANGYUZY  阅读(94)  评论(0编辑  收藏  举报