python-模块规则与项目开发规范

模块规则

import加载的模块分为四个通用类别: 
  1 使用python编写的代码(.py文件)
  2 已被编译为共享库或DLL的C或C++扩展
  3 包好一组模块的包
  4 使用C编写并链接到python解释器的内置模块

多次导入只进行一次
  导入成功后会把模块加载到内存,再次导入引用它
sys.moudles记录了所有被导入的模块
sys.path 记录了导入模块的时候寻找的所有路径
模块的查找顺序是:内存中已经加载的模块->内置模块->sys.path路径中包含的模块
凡是在导入时带点的,点的左边都必须是一个包

导入模块的时候都做了些什么?
首先. 在导入模块的⼀瞬间. python解释器会先通过 sys.modules来判断该模块是否已经导入了该模块.
如果已经导入了了则不再导入. 如果该模块还未导入过. 则系统会做三件事.
1. 为导入的模块创立新的名称空间
2. 在新创建的名称空间中运该模块中的代码
3. 创建模块的名字. 并使用该名称作为该模块在当前模块中引用的名字.
我们可以使用globals来查看模块的名称空间
__name__
如果此模块未被导入,__name__ == '__main__' 否则 __name__ = 模块名
应用: if __name__ == '__main__': 只有run此模块会运行,被其他其他模块导入不会运行
正确的导入模块的顺序:
1. 所有的模块导入都要写在最上面. 这是最基本的
2. 先引入内置模块
3. 再引入扩展模块
4. 最后引入你自己定义的模块
from xxx import xxx
与import功能相似,from import 导入目标模块的部分内容
坑:
如果两次 from import XXXX 导入的XXX名字相同,导入的内容会被覆盖。
from xxx import *
导入XXX模块中的所有内容 (如果模块写了__all__,则导入__all__中的内容)



文件夹内包含了__init__.在导入包的时候, 默认执行__init__.py
查找的顺序: 内存 -> 内置 -> sys.path
sys.path : 根据你启动的脚本所在的位置确定查找包, 模块的路径
sys.path.insert(0, "你想加入的位置")

相对导入
相对于当前文件所在文件夹
. 当前
.. 上一层
# 使用了相对路径就不能在包内直接执行了,包外执行正常。
只能在一个包中使用,不能用于不同目录内
# 可以随意移动包 只要能找到包的位置,就可以使用包里的模块
封装好的包,供别人调用的,内部一般用相对导入,比如框架。
from ..cmd import manage
manage.main()
绝对导入
从sys.path找. 根
# 使用绝对路径 不管在包内部还是外部 导入了就能用
# 不能挪动,但是直观
from glance.cmd import manage
manage.main()

项目开发规范
项目名 
bin
start.py
可执行文件,程序入口
conf
配置文件,给运维人员看
core
核心代码,项目所有源代码
db
数据库文件
lib
自定义通用模块和包
log
日志文件
README
项目说明文件

注:运行程序时,在bin目录下执行start.py代码,不可以直接执行core下的模块。
posted @ 2018-09-28 23:30  写bug的日子  阅读(648)  评论(0编辑  收藏  举报