# 模块和包
[python模块与包的导入 - 沧澜猛兽 - 博客园](https://www.cnblogs.com/charles1ee/p/6560277.html)
## 什么是模块
一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀
>模块名字不能是中文
>在Python中一切皆对象,所以模块也是一个对象
## 为什么要使用模块
首先来说,运行python文件的方式一共有两种:
1. 一种是`脚本`运行
1. 命令行
2. 编辑器
2. 一种就是`模块`导入的方式
模块化的程序是指将大型的,笨重的编程任务划分成单独的,小巧的更易于管理的子任务或者模块的过程,然后在通过关联来创造完成一个大型的任务
### 模块化的优点:
简单性
可维护性
重用性
范围

## 部分知识点
## 在import的过程中发生了那些事情
import一个模块相当与执行了这个模块
一个模块不会被重复导入
如何去使用被导入模块中的名字
> 模块名.[模块中的变量名字]
在import

1. 寻找模块
2. 如果找到了,就开辟一块空间,执行这个模块
3. 把这个模块中用到的名字都收录到这个新开辟的空间中
4. 创建一个变量来引用这个模块的空间
> 1. 模块不会被重复导入
> 2. 模块和文件之间的内存空间始终是隔离的
> 3. 模块的名字必须是符合变量命名规范的
>

## 导入多个模块

> `注意`: PEP8 不允许这个写,必须一行导入模块
> 导入的话 也需要按照 内置 第三方模块 自定义模块的顺序
>
```python
import os # 内置
import django # 第三方
import my_module # 自定义
```
## 给模块 起别名
例如:
```python
import my_module as m
m.name
```
> 一旦起了别名 原名字就不可以使用了.
> 所以这里面my_moudle.name 就不可以使用了
方便\简化
用途

## 模块搜索路径
```python
import
```
目前正常的sys.path中除了内置\扩展模块所在的路径之外只有一个路径是永远不会出问题的
你执行执行的是这个文件所在的目录
一个模块是否能被导入,就看这个模块所在的目录在不在sys.path中

这样使用就可以使用了,虽然pycharm报错但是可以执行

## 两种运行一个py文件的方式
1.直接运行 cmd pycharm 脚本
2.导入 模块
`__name__` ==`__main__`


如果这个py文件既想被执行又可能被导入,这样就把想打印的内容就放在if下载
以后开发的使用,把一执行就打印出来的动作,放在if下载
## from ----import



all 和* 配合使用
使用方式:
`__all__` = ['xxxx','xxxx']
如果使用了`__all__`参数,那么后面要跟一个列表,然后里面以字符串的形式写入,代表着如果里面写入了一些名字,那么谁在通过import test from * 调用,只会调用`__all__`里面的名字,那么没有写在里面的名字就不会被调用

强制导入 仍然可以使用
## 补充内容

pyc只能提高程序的启动效率并不能提高程序的执行效率
### 模块的导入和修改
读到内存中的内容 修改没用
如下如

就算再次导入 也是无效的

如果一定要修改

不要reload 不会这个用的
### 模块的循环使用

程序设计问题

就会出现 报错
不能这样

即便是发生了循环引用,但没有发生报错,也会出现莫名的问题,所以绝对不用
### dir模块
可以获取这个模块中的所有名字

# 包
## 从包当中导入模块 ****
### 什么是包
含有一个__init__.py的文件夹就是一个包
包包中通常还有一些py文件
python2 没有 `__init__`的文件 两个文件不能互相导入
python3 无所谓
### 导入方法一
import

点的左边一定是个包
终点一定是个模块,具体到某个模块,不然就GG
### 导入方法二
from import

也可以这么写

## 直接导入包 **

### 绝对导入
导入包的过程中发生了什么事情
相当于执行了这个包的`__init__`.py文件
sys.path中的内容 永远是你当前工作的路径
### 导入包的相对导入 只能在包中使用
1

> `问题`:没有办法直接执行了
>说明:
>**无论是lmport 形式还是from...import形式,凡是在导入语句中(而不是在使用时)遇到的带点的,就说明这是包才有的导入语法,不能直接执行该文件了**
>

作为一个包来说 包里面的文件导入都应该 考虑到 sys.path 的文件的问题
## 一些说明
1. 关于包相关的导入语句也分为`import`和`from...import...`两种,但是无论哪种,无论什么位置,在导入时都必须遵循一个原则:**`凡事在导入时带点的,点的左边必须是一个包,否则非法`**。可以带有一连串的点,如item.subitem,subsubitem.但是都必须遵循这个原则
2. 对于导入后,在使用时就没有这种限制了,点的左边可以是包,模块,函数类(他们都可以用点的方式调用自己的属性)
3. 对于什么时候选择from..import..的场景
如果我们想直接使用name那么就必须使用这个了
```python
import sys
import glance.api.policy as gl
print(sys.path)
g1.get()
```
# 软件的开发规范


