1.1.5 模塊與包(Django 基礎學習細節)
模塊和包是 Python 項目組織和代碼復用的基礎。Django 項目本質上就是由多個模塊和包組成。理解和靈活運用模塊與包機制,是寫好大型項目的關鍵。
一、import、from-import、as 的用法
1. import
- 用于導入整個模塊,模塊名為文件名(不帶 .py)。
- 用法:
import math print(math.sqrt(16)) # 4.0
2. from … import …
- 用于從模塊或包中導入指定成員(變量、函數、類等)。
- 用法:
from math import sqrt, pi print(sqrt(9)) # 3.0 print(pi) # 3.141592653589793
3. as
- 用于給模塊或成員起別名,簡化書寫或防止命名沖突。
- 用法:
import numpy as np from datetime import datetime as dt print(np.array([1, 2, 3])) now = dt.now()
4. 多層包導入
- 支持多級包結構:
from myproject.utils.tools import my_func
二、name == “main”
1. 含義
- 每個 Python 文件都作為一個模塊,模塊有一個
__name__
屬性。 - 如果模塊被直接運行,
__name__ == "__main__"
;如果被導入,__name__
等于模塊名。
2. 作用
- 只在腳本直接運行時執行某段代碼,導入時不執行。
- 常用于編寫測試代碼、命令行入口。
3. 示例
# foo.py
def say_hi():print("Hi!")if __name__ == "__main__":say_hi() # 直接運行 foo.py 時會執行
# bar.py
import foo # 導入 foo.py,不會執行 if __name__ == "__main__" 下的內容
三、sys.path
1. sys.path 的作用
- 是一個列表,包含所有 Python 查找模塊的目錄。
- 可動態添加搜索路徑,方便跨目錄導入。
2. 示例
import sys
print(sys.path)
sys.path.append("/path/to/my/modules")
# 現在可以 import 該目錄下的模塊
3. 應用場景
- 復雜項目/部署時臨時添加自定義模塊路徑
- 避免命名沖突和導入錯誤
四、包的初始化(init.py)
1. 包的概念
- 包是包含多個模塊的文件夾,必須包含一個
__init__.py
文件(可為空)。 __init__.py
的存在使 Python 將該目錄識別為包。
2. init.py 的作用
- 初始化包(如導入常用模塊、定義包級變量/函數等)
- 控制子模塊的導出(通過 all)
- 可以寫包級別的初始化邏輯
3. 示例結構
myproject/
├── __init__.py
├── foo.py
├── bar.py
# myproject/__init__.py
from .foo import say_hi
from .bar import some_func
- 導入包時自動執行
__init__.py
代碼:
import myproject
myproject.say_hi()
4. all 控制包成員
# __init__.py
__all__ = ["foo", "bar"]
from myproject import *
時只導入foo
,bar
。
五、模塊與包在 Django 項目中的應用
- 項目根目錄即包(包含 manage.py、settings.py、urls.py 等模塊)
- 每個 app 是獨立包(含 models.py、views.py、admin.py、apps.py 等模塊)
- 通常會在
__init__.py
中做初始化或暴露接口
六、實用小結
- 用 import/from-import/as 靈活組織和復用代碼
- 用
__name__ == "__main__"
編寫可測試或可復用模塊 - sys.path 控制模塊搜索路徑,解決復雜項目的導入問題
__init__.py
是包的標識和初始化位置,建議始終保留即使為空