Python_閉包、裝飾器
阿新 • • 發佈:2019-02-19
閉包
內部函式呼叫外部函式的變數(一個閉包就是你呼叫的一個函式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
- 裝飾的時候:誰離被裝飾的函式越近,那麼就先裝誰
- 呼叫的時候:誰離的遠,那麼先調誰