Python装饰器(一)
要學(xué)習(xí)裝飾器,首先要知道閉包的東西。不過這里不再說閉包的東西了。
我們假設(shè)一個場景:假如在公司有多個開發(fā)部門,A、B....?,F(xiàn)在A部門開發(fā)出了一個功能,然后其他部門去調(diào)用A部門開發(fā)的功能。
比如: 如下f1、f2...,是由A部門來開發(fā),然后其他部門使用。
def f1():print('f1')def f2():print("f2")...然后有一天根據(jù)業(yè)務(wù)需要,需要在每個方法添加驗(yàn)證,也就是在執(zhí)行功能前進(jìn)行身份驗(yàn)證。
這個時候想必大家心里也都有方法。
比如 在f1 函數(shù)里面直接修改該代碼加上驗(yàn)證。或者把驗(yàn)證方法提取出來,封裝成哥函數(shù)。在調(diào)用f1之前先調(diào)用驗(yàn)證方法。如果用這兩方法來修改的話,那么在其他部門調(diào)用的時候也需要修改調(diào)用方法。
def f1():#驗(yàn)證print('f1')上面的兩種方法中雖然能實(shí)現(xiàn)要求,但是寫代碼要遵循 開放封閉 原則,雖然在這個原則是?的?向?qū)ο箝_發(fā),但是也適?于函數(shù)式編程,簡單來說,它規(guī)定已經(jīng)實(shí)現(xiàn)的功能代碼不允許被修改,但可以被擴(kuò)展。
我再說一種用閉包實(shí)現(xiàn)的方法。
def w1(fn):def inner():print("驗(yàn)證中---")fn()return innerdef f1():print("f1")f1 = w1(f1) # 調(diào)用的時候也是使用 f1()說一下這個實(shí)現(xiàn)原理。
w1函數(shù)是要驗(yàn)證的代碼,Python在解釋的時候從上到下掃描,然后開辟了兩個內(nèi)存塊,并且有兩個變量 w1和f1分別指向?qū)?yīng)的內(nèi)存塊。(如上圖A所示)
在執(zhí)行到 f1 = w1(f1) 的時候,w1函數(shù)里面還有個函數(shù)的定義,那么在 w1里面開辟一個內(nèi)存(上圖右面w1里面藍(lán)色的框),并且里面有個變量f1。這個時候 w1(f1)?執(zhí)行完后返回了inner函數(shù)的地址,也就是上圖右邊藍(lán)色框的地址,并且把f1函數(shù)的地址指向了藍(lán)色框。
所以根據(jù)上面的代碼在執(zhí)行 f1() 的時候 首先執(zhí)行f1新指向的藍(lán)色框,然后再執(zhí)行藍(lán)色框里面指向的舊f1的代碼。
這樣就能達(dá)到在f1里面加上新的代碼了。其實(shí)這種方法就是閉包實(shí)現(xiàn)的,那么其實(shí)還有其他方法,也就是要說的裝飾器,首先開一下 用裝飾器怎么實(shí)現(xiàn)。
def w1(func):print("----------w1----------")def inner():print("inner")func()return inner@w1 def f1():print("f1")print("執(zhí)行-------") f1()只需要在 f1函數(shù)定義前面加上 @w1 就行了。這就是裝飾器!
總結(jié)
以上是生活随笔為你收集整理的Python装饰器(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【机器学习】图解机器学习中的 12 种交
- 下一篇: 【Python】如何在Excel中调用P