Python 被譽為「瑞士軍刀」,其強大的標準庫與模組生態是核心競爭力。本文承接基礎語法,深入探討模組化組織程式碼、作用域規則(LEGB)、類別機制與繼承模型,並對比 Python 2/3 差異,幫助開發者建立工程化思維。
專案成長到一定規模,必須將功能拆分為多個 .py 檔案並組織成目錄樹。Python 以「目錄 + __init__.py」定義套件(Package)。
ProjectRoot/
├── main.py # 入口腳本
├── utils/
│ ├── __init__.py # 可為空,標記為套件
│ ├── helper.py
│ └── constants.py
└── models/
├── __init__.py
└── user.py
__name__# main.py
import utils.helper
print(utils.helper.__name__) # 輸出 'utils.helper'
from models import user
u = user.User('Alice', 30)
import 會執行目標模組的頂層程式碼(只執行一次,後續匯入直接從 sys.modules 快取取得)。__init__.py 可執行套件初始化邏輯(如動態匯入子模組、設定 __all__ 控制 from pkg import * 行為)。dir(module) 列出模組公開屬性,除錯好幫手。Python 變數查找順序:Local → Enclosing → Global → Built-in。關鍵字 global、nonlocal 打破預設賦值行為。
def scope_test():
spam = 'test spam' # Local
def do_local():
spam = 'local spam' # 新建區域變數,不影響外層
def do_nonlocal():
nonlocal spam # 綁定外層 Enclosing 作用域的 spam
spam = 'nonlocal spam'
def do_global():
global spam # 綁定模組層級 Global spam
spam = 'global spam'
do_local()
print('After local:', spam) # test spam
do_nonlocal()
print('After nonlocal:', spam) # nonlocal spam
do_global()
print('After global:', spam) # global spam
scope_test()
print('Global scope:', spam) # global spam
Python 類別機制融合 C++ 多重繼承與 Modula-3 模組觀念,採「基於協議」而非「基於介面」的鴨子類型。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
print('constructor run')
def greet(self):
print(f'Hi, I am {self.name}, {self.age} years old.')
p = Person('Wang', 20)
p.greet()
self 相當於 C++/Java 的 this,但必須顯式寫在方法第一參數(慣例命名為 self)。__init__ 為建構子,物件建立時自動呼叫。class Student(Person):
def __init__(self, name, age, student_id):
super().__init__(name, age) # Python 3 簡潔 super()
self.student_id = student_id
def greet(self): # 覆寫 override
super().greet()
print(f'Student ID: {self.student_id}')
s = Student('Li', 22, 'S12345')
s.greet()
class C(A, B):,方法解析順序遵循 MRO(C3 線性化)。object,統一為新式類,統一物件模型。Python 不支援同名多載,但可用預設參數達到同樣效果:
def greet(self, prefix='Hello'):
print(f'{prefix}, {self.name}')
子類別可隨意覆寫父類別方法,無需 virtual 關鍵字,體現動態語言靈活性。
venv 隔離專案依賴,配合 requirements.txt 鎖定版本。lower_case、類別 CapWords、常數 UPPER_CASE。__all__ 明確公開 API,避免內部實作洩漏。def func(x: int) -> str:,配合 mypy 靜態檢查提升可維護性。