9、python全栈之路-模块与包

九、模块与包

http://www.cnblogs.com/Eva-J/articles/7292109.html#_label7

1、模块

1.1 什么是模块

常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。

但其实import加载的模块分为四个通用类别: 

1 使用python编写的代码(.py文件)

2 已被编译为共享库或DLLCC++扩展

3 包好一组模块的包

4 使用C编写并链接到python解释器的内置模块

1.2 为何要使用模块

   如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通过python test.py方式去执行,此时test.py被称为脚本script

 

    随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用

1.3 模块导入规则

python建议一行只导入一个模块 多个模块分多行导入

1.4 模块导入顺序

先导入内置的,再导入第三方的,再导入自己写的

1.5 模块的命名空间

模块有自己的命名空间

1.6 import的用法

#导入模块干了哪些事:

#1 执行源文件

#2 以一个源文件的全局名称空间

#3 在当前位置拿到一个模块名,指向2创建的名称空间

 

1.7 as起别名

 

1.8 from...import

#优点:使用源文件内的名字时无需加前缀,使用方便

#缺点:容易与当前文件的名称空间内的名字混淆

1.8.1 from...import

 

1.8.2 from 模块名 import 名字 as 重命名

如果你导入的模块过大,而你要用的功能很少''

1.8.3 from 模块名 import *

__all__*配合,__all__只能约束*,import *时列表里面加功能名

__all__=[] 列表里面加字符串

 

有文件用from my_module import *导入模块时,只能导入__all__列表里面的方法

1.9 模块的搜索路径

1.9.1 sys.modules

可以通过sys.modules找的内存中已经加载了哪些写模块

 

1.9.2模块的查找顺序

模块的查找顺序是:内存中已经加载的模块->内置模块->sys.path路径中包含的模块

python程序的修改必须重新加载才能生效,自定义的模块名一定不要与python自带的模块名重名

1.9.3 sys.path

#注意:自定义的模块名一定不要与python自带的模块名重名

#内存中--》内置模块————》sys.path

sys.path第一个值是执行文件的当前目录

 

添加模块路径到环境变量

import sys
#print(sys.path)
sys.path.insert(0,r'C:\Users\Administrator\PycharmProjects\python18期周末班\day5\模块\模块的搜索路径\aaa')
print(sys.path)

 

1.10__name____main__

区分python文件的两种用途

用途一:当作脚本文件使用

用途二:当作模块使用

 

__name__:文件当作脚本运行时__name__等于__main__,文件当作模块被加载运行时__name__等于模块名

 

所以在写模块脚本时可以加判断条件 if __name__ == '__main__':,这样就可以区分python模块与脚本的用法,写模块时应该这样写。

 

1.11 relod()

import importlib

importlib.reload() 如果在导入模块后执行某个方法前修改了模块中的这个方法,用reload()这个方法可以立即导入修改的方法不需要重新导入模块,只能用于测试环境

 

2、包

2.1 注意

1、无论是import形式还是from...import形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高警觉:这是关于包才有的导入语法

2. 包是目录级的(文件夹级),文件夹是用来组成py文件(包的本质就是一个包含__init__.py文件的目录)

3. import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件

 

强调:

  1. python3中,即使包下没有__init__.py文件,import 包仍然不会报错,而在python2中,包下一定要有该文件,否则import 包报错

  2. 创建包的目的不是为了运行,而是被导入使用,记住,包只是模块的一种形式而已,包即模块,包是文件的集合

2.2 __init.py__

用执行文件执行__init.py__中导入的包时,路径以执行文件为准,所以要有from...import形式导入,执行文件导入包是实际执行包下面的__init__.py文件。

 

2.3 绝对导入和相对导入

当包内的文件要导入包内其他文件的时候,即如果包的模块之间存在引用关系:

绝对路径的导入 :导入的路径会随着包与文件之间关系的变化而变化在包内部、外部都可以执行

相对路径的导入 :一次写好的模块的导入关系,不需要关心模块和文件之间的关系只能在包的外面执行

2.3.1 绝对导入

 

2.3.2 相对导入

 

3、项目开发规范

 

3.1 bin

bin目录中固定有一个start.py文件作为启动文件

所有的代码以start.py为出发点 start.pycore里的core.py文件

start.py开头固定写

import os
import sys
BaseDir = os.path.dirname(os.path.dirname(os.getcwd()))
sys.path.append(BaseDir)

from ChoiceCourses.core import core
core.main()

 

os.getcwd()取当前文件路径

os.path.dirname 取目录

3.2 conf

放配置文件

3.3 core

放核心文件,目录中要有一个core.py文件存放输入输出之类的代码或者字典

在文件内调用其他模块用绝对路径

 

 

包用相对路径 因为包是在外部调

项目用绝对路径 因为项目在自己内部调

3.4 db

存放所有数据

3.5 lib

存放别人写的模块,不需要pip安装可以直接用的模块,非自己写的模块

3.6 log

存放日志文件

 

posted @ 2017-09-23 16:19  星辰大海里的小金鱼  阅读(154)  评论(0编辑  收藏  举报