1. 程式人生 > >Python_閉包、裝飾器

Python_閉包、裝飾器

閉包

  • 內部函式呼叫外部函式的變數(一個閉包就是你呼叫的一個函式A,這個函式A返回一個函式B給你。這個返回的函式B就叫做閉包)

  • 優點:可以提高程式碼的可複用性,減少了程式碼的可移植性

  • 特點:一個獨立的空間,多個閉包互補影響,佔用空間遠小於例項物件;

  • 注意點:引用了外部函式的區域性變數,則外部函式的區域性變數沒有及時釋放,消耗記憶體

  • nonlocal 修改一個函式內部變數時使用

# 定義一個函式
def test(number):

        # 在函式內部再定義一個函式,並且這個函式用到了外邊函式的變數,那麼將這個函式及用到的一些變數稱之為閉包
        def test_in
(number_in):
print("in text_in 函式, number_in is %d" % number_in) return number + number_in # 其實這裡返回的就是閉包的結果 return text_in # 給test函式賦值,這個20就是給引數number ret = test(20) # 注意這裡的100其實給引數的number_in print(ret(100)) # 注意這裡的200其實給引數number_in print(ret(200)) 執行結果: in test_in 函式, number_in is
100 120 in test_in 函式, number_in is 200 220

裝飾器

  • 定義一個函式,在執行時動態增加功能

  • 在不修改原函式的程式碼的情況下,新增新的功能,可以在執行原函式之前加,也可以在執行原函式之後新增

  • 注意點:

    • 裝飾器只能在呼叫原函式之前或之後新增功能,而不能在函式的中間新增功能
    • 只要用裝飾器裝飾了的函式,那麼不管被呼叫多少次,都是裝飾之後的效果
  • 裝飾器(decorator)功能
    1.引入日誌
    2.函式執行時間統計
    3.執行函式前預備處理
    4.執行函式後清理功能
    5.許可權校驗等場景
    6.快取

#### 第一波 ####
def foo()
       print
("foo") foo # 表示是函式 foo() # 表示執行foo函式 #### 第二波 #### def foo() print("foo") foo = lambda x: x + 1 foo() # 執行lambda表示式, 而不再是原來的foo函式, 因為foo這個名字被重新指向另外一個匿名函式
  • 寫程式碼要遵循開放封閉原則,它規定已經實現的功能程式碼不允許被修改,但可以被擴充套件
    - 封閉:對實現功能的程式碼塊
    - 開放:擴充套件開發

  • 一般情況下為了讓裝飾器更通用,可以有return

  • 裝飾的時候:誰離被裝飾的函式越近,那麼就先裝誰
  • 呼叫的時候:誰離的遠,那麼先調誰