## 模塊
> 定義的一個python的文件,后綴名為.py腊脱。這個文件被稱為模塊访得。
>
> 模塊中通常會定義一些相似的 類,函數(shù)等代碼內容陕凹,提供給別的程序引入后使用悍抑。
#### 系統(tǒng)模塊
> 系統(tǒng)模塊就是一個python的程序腳本,專門提供給我們自己的程序使用杜耙。它們是在安裝好python環(huán)境時搜骡,就已經(jīng)存在的,需要的時候可以使用 import 導入到程序中使用佑女。
>
> import logging记靡,json,time团驱。摸吠。。嚎花。
#### 自定義模塊
> 就是自己創(chuàng)建一個python腳本寸痢,定義一些類或方法,供別的腳本導入后使用贩幻。
例如定義一個My.py的文件如下
```python
# My.py
# 定義類
class MyException():
? ? pass
# 定義函數(shù)
def func():
? ? print('我是一個模塊中的func函數(shù)')
# 定義變量
love = 'iloveyou'
```
在定義一個python腳本就可以引入上面的文件作為模塊使用
main.py
```python
# main.py 在當前腳本中如果需要使用一些已經(jīng)定義好的功能時轿腺,可以選擇對應的模塊两嘴,導入后使用
# 使用系統(tǒng)模塊 time
import time
print(time.time())
# 使用自定義異常處理 模塊
import My
# 使用模塊中定義的類
obj = My.MyException()
print(obj)
# 使用模塊中的函數(shù)
My.func()
# 使用模塊中定義的變量
print(My.love)
# 想使用模塊中的內容時,除了導入模塊族壳,還可以在在指定模塊中導入指定的內容
from My import love? # 導入My模塊中的love變量
from My import love as lv # 導入My模塊中的love變量憔辫,起個別名
print(love)
print(lv)
```
#### 模塊中的測試代碼
```python
# 自定義模塊中,通常只是去定義類或函數(shù)仿荆,變量贰您,等,并不調用
# 如果在自定義模塊中拢操,想要寫一些測試代碼锦亦,在當前模塊作為主程序使用時執(zhí)行,
# 而作為模塊被別的程序導入時不執(zhí)行令境,那么可以把測試代碼寫到 下面代碼塊中
if __name__ == '__main__':
? ? print('這個位置寫的代碼只有當前腳本被直接運行時觸發(fā)')
# 特殊的變量 __name__
# __name__ 這個變量杠园,在當前腳本作為模塊被別的程序導入是 __name__的值 是當前這個模塊的名稱
#在當前腳本被作為主程序直接由python解析運行時,__name__的值 是 '__main__'
name = __name__
print(name)
```
## 包
> 包可以理解為是一個文件夾舔庶,里面包含了多個python文件抛蚁。
### 包的結構:
```python
'''
package/? # 包(文件夾)
├── __init__.py? # 包中的初始化文件
├── a.py? ? ? ? # 包中的模塊
├── b.py
└── ps/? # 子包
? ├── __init__.py
? ├── c.py
? └── d.py
'''
```
### 包的使用方法
```python
# 1. 直接把包當作模塊導入,可以用的內容是 __init__.py文件中定義的
# 不推薦這種用法
import package
package.funcpa()
#2惕橙。 可以導入模塊中的所有內容
# 注意這個內容是由 __init__.py文件中定義的 __all__ 這個變量指定的模塊
# 好處是可以直接導入指定的所以模塊瞧甩,并且使用時,直接使用指定的模塊名即可
from package import? *
a.funca()
b.funcb()
# 3弥鹦。 導入指定包中的指定模塊
from package import a
a.funca()
# 4肚逸。從指定包的指定模塊中導入指定的內容
from package.b import funcb
funcb()
# 5。從指定包的子包中導入模塊
from package.ps import c
c.funcc()
# 6彬坏。 從指定包的子包的指定模塊中導入指定內容
from package.ps.d import funcd
funcd()
```
## 導入方式的分類
### 絕對導入
```
# 絕對導入的方式會使用[搜索路徑]去查找和導入指定的包或模塊
import 模塊
import 包
import 包.模塊
from 模塊 import 內容
from 包 import 模塊
from 包.模塊 import 內容
```
### 相對導入
**注意:相對導入只能在非主程序的模塊中使用朦促,不需要直接運行的模塊文件**
```
# 相對導入
from .包名/模塊名 import 模塊/內容
from ..包名/模塊名 import 模塊/內容
. 代表當前
..代表上一級
```
### 搜索路徑
> 在導入模塊或包時,程序查找的路徑
```python
'''
主要的搜索路徑
1. 當前導入模塊的程序所在的文件
2. python的擴展目錄中 C:/Users/username/AppData/local/.../Python37/lib
3. python解釋器指定的其它 第三方模塊位置 /lib/sitepackages
'''
# 在當前腳本中查看 包或模塊 的 搜索路徑
import sys
print(sys.path)
'''
[?
? ? '',
? ? '/Library/Frameworks/Python.framework/Versions/3.7/lib/python37.zip',
? ? '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7',
? ? '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload',
? ? '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages'
]
'''
# 可以自己定義一個路徑栓始,加入到搜索路徑中
sys.path.append('/Users/yc/Desktop')
```
## 單入口程序
> 單入口程序是指整個程序都是經(jīng)過一個主程序文件在運行思灰,其它程序都封裝成了包或模塊
```python
# 單入口文件是作為程序直接被運行的唯一文件,其它都是作為模塊或包混滔,被導入單入口中去執(zhí)行
'''
ATM/
|---- main.py? # 當前程序的主入口文件,單入口文件,唯一直接運行的文件
|---- package/ # 主要程序模塊包
|---- |----- __init__.py? # 包的初始化文件
|---- |----- View.py? ? ? # 視圖函數(shù)模塊
|---- |----- Controller.py# 控制器模塊
|---- |----- Card.py? ? ? # 銀行卡模塊
|---- |----- User.py? ? ? # 用戶模塊
|---- databases/ # 數(shù)據(jù)存儲文件夾
|---- |---- user.txt
|---- |---- user_id_card.txt
main是程序的主入口文件歹颓,會被直接作為主程序運行坯屿,所以main.py文件中必須使用 絕對導入 方式
'''
```