Python 中沒有類似 C/C++ 的 static 關鍵字,但在類和函數中仍可通過一些技巧實現「靜態變量」效果——即跨調用保持狀態。本文介紹三種常見實現方式,並以累加器為例演示。
__init__ 與 __call__定義一個類,在 __init__ 初始化計數器,並在 __call__ 中更新並返回數值。實例化後,該對象即可像函數一樣被調用。
class Accumulator:
def __init__(self, n=0):
self.n = n
def __call__(self, i):
self.n += i
return self.n
a = Accumulator()
print(a(1)) # 1
print(a(2)) # 3
print(a(3)) # 6
print(a(4)) # 10
外層函數接收初始值,內部定義一個類封裝狀態,返回該類實例的方法。每次調用外層函數會創建新的累加器實例。
def make_accumulator(n=0):
class Acc:
def __init__(self, s):
self.s = s
def inc(self, i):
self.s += i
return self.s
return Acc(n).inc
a = make_accumulator()
print(a(1)) # 1
print(a(2)) # 3
print(a(3)) # 6
print(a(4)) # 10
Python 函數的預設參數在定義時只計算一次,若使用可變對象(如列表),則所有調用共享同一對象,從而達到靜態效果。注意:此技巧常被視為反模式,實際項目中請謹慎使用。
def accumulator(i, L=[]):
if not L:
L.append(0)
L[0] += i
return L[0]
print(accumulator(1)) # 1
print(accumulator(2)) # 3
print(accumulator(3)) # 6
print(accumulator(4)) # 10
以上三段代碼在 Python 2.6 環境下輸出均為:
1
3
6
10
理解這些機制有助於深入掌握 Python 的物件模型與作用域規則。