# 模塊和包
[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()
```
# 軟件的開發規范


