首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Python 類與函數中實現靜態變量的三種方法

     編輯:更多程式設計知識

前言

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

總結

  • 方法一 結構清晰,符合面向對象風格,推薦使用;
  • 方法二 將狀態封裝在閉包中,較為隱蔽但靈活;
  • 方法三 利用預設參數副作用,代碼極簡但可讀性差,且易導致難以排查的 Bug,生產環境不建議使用。

理解這些機制有助於深入掌握 Python 的物件模型與作用域規則。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved