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


九、模块与包

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

1、模块

1.1 什么是模块

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

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

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

2 已被编译为共享库或DLL的C或C++扩展

3 包好一组模块的包

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

1.2 为何要使用模块

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

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

1.3 模块导入规则

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

1.4 模块导入顺序

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

1.5 模块的命名空间

模块有自己的命名空间

1.6import的用法

#导入模块干了哪些事:

#1 执行源文件

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

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

技术分享

技术分享

1.7as起别名

技术分享

技术分享

技术分享

技术分享

1.8from...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.1sys.modules

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

技术分享

技术分享

1.9.2模块的查找顺序

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

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

1.9.3sys.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.py调core里的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

存放日志文件

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

评论关闭