Python閉包和裝飾器

閉包:內(nèi)部函數(shù)的參數(shù)調(diào)用外部函數(shù)的參數(shù)就是一個(gè)閉包

def A():

????a = 1

????def B():

????????print(a)

????return B #

a = A()

a()

這樣的一個(gè)函數(shù)就構(gòu)成了閉包函數(shù)

例子說明去理解閉包和裝飾器之間的關(guān)系

from functools import wraps

def wrapper(f):

????@wraps(f)

????def inner(*args, **kwargs):

????????ret = f(*args, **kwargs)

????????return ret

????return inner

@wrapper? # func = wrapper(func) wrapper函數(shù)

def func(a, b, c, d=1234):

????print(a, b, c, d)

????return "Hello World"

-------------------------------------結(jié)果----------------------------------------

print(func.__name__)

if func.__doc__:

print("True")

--------------------------------------------------------------------------------

*args 是接受任意數(shù)據(jù)類型

**kwargs是接受位置參數(shù) 比如a=1 ,b =4

@wrapper其實(shí)就是去執(zhí)行wrapper函數(shù)把func當(dāng)成參數(shù)去執(zhí)行,func進(jìn)入wrapper之后,本質(zhì)上就是執(zhí)行了inner函數(shù)。

-------------------------------------------------------------------------------------

加深小練習(xí):

編寫裝飾器,為多個(gè)函數(shù)加上認(rèn)證功能(用戶的賬號(hào)密碼來源于文件)要求登錄成功一次 后續(xù)的函數(shù)都無需輸入用戶名和密碼

FLAG = False

def login(f):

????def inner(*args, **kwargs):

????global FLAG

????if FLAG:

????????ret = f(*args, **kwargs)

????????return ret

????else:

????????username = input("username:")

????????password = input("password:")

????????if username == 'admin' and password == '1234':

????????????FLAG = True

????????????ret = f(*args, **kwargs)

????????????return ret

????????else:

????????????print("錯(cuò)誤!")

????return inner


@login

def shoplist_add():

????print("add")


@login

def shoplist_delete():

? ? print("delete")

-----------------------------------------------------------------------------------

# 編寫裝飾器 為多個(gè)函數(shù)加上記錄調(diào)用功能,要求每次調(diào)用函數(shù)都將被調(diào)用的函數(shù)名稱寫入文件

def log(func):

????def inner(*args, **kwargs):

????????with open('log', 'a', encoding='utf-8') as f:

????????????f.write(func.__name__ + '\n')

???????????ret = func(*args, **kwargs)

????????????return ret

????????return inner


@log? # shoplist_add = log(shoplist_add)

def shoplist_add():

????print("add")

@log

def shoplist_delete():

????print("delete")


shoplist_delete()

shoplist_add()

-------------------------------------------------------------------------------------

#.1編寫下載網(wǎng)頁內(nèi)容的函數(shù) 要求功能是: 用戶傳入一個(gè)url 函數(shù)返回下載頁面的結(jié)果2.為題目1編寫裝飾器 實(shí)現(xiàn)緩存網(wǎng)頁中歐內(nèi)容的功能

具體 實(shí)現(xiàn)下載的頁面存放與文件中 如果文件內(nèi)有值(文件大小不為0)就優(yōu)先從文件中讀取網(wǎng)頁內(nèi)容 否則就去下載'''

import os

from urllib.request import urlopen

def cache(func):

????def inner(*args, **kwargs):

????????if os.path.getsize('web_Cache'):

????????????with open('web_Cache','rb')as f:

????????????????return f.read()

????????ret = func(*args, **kwargs)

????????with open('web_Cache','wb') as f:

????????????f.write(b'*********' + ret)

????????return ret

????return inner

@cache # get = cache(get)

def get(url):#inner

? ? code = urlopen(url).read()

return code

# {'網(wǎng)址':"文件名"}

url ='https://baike.baidu.com/item/%E5%A4%A7%E4%BD%AC/33459'

ret = get(url)

print(ret)

ret = get(url)

print(ret)


python裝飾器進(jìn)階代碼:

import time

Flag =True

def contrl_flag(flag):

????def timer(func):

????????def inner(*args, **kwargs):

????????????if flag:

????????????????start = time.time()

????????????????ret = func(*args, **kwargs)

????????????????end = time.time()

????????????????print(end - start)

????????????????return ret

???????????else:

????????????????ret = func(*args, **kwargs)

????????????????return ret

????????return inner

????return timer


@contrl_flag(Flag)

def test1():# @timer = timer(test1)

? ? time.sleep(0.1)

print("test1")


@contrl_flag(Flag)

def test2():

????time.sleep(0.1)

????print("test2")


test1()

test2()

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本節(jié)課綱: 魔法方法之_call_ 閉包 裝飾器 裝飾器實(shí)例 一、魔法方法之_call_ 在Python中,函數(shù)其...
    郭_揚(yáng)閱讀 472評(píng)論 0 0
  • python萬物皆對(duì)象! 閉包 閉包:兩個(gè)函數(shù)的嵌套,外部函數(shù)返回內(nèi)部函數(shù)的引用,外部函數(shù)一定有參數(shù) def 外部...
    風(fēng)舞柏楊閱讀 837評(píng)論 2 0
  • 1. 閉包 概念:在函數(shù)嵌套的前提下,內(nèi)層函數(shù)引用了外層函數(shù)的變量(包括參數(shù)),外層函數(shù)又把內(nèi)層函數(shù)當(dāng)做返回值進(jìn)行...
    馬本不想再等了閱讀 362評(píng)論 1 7
  • 裝飾器本質(zhì)上是一個(gè)函數(shù),該函數(shù)用來處理其他函數(shù),它可以讓其他函數(shù)在不需要修改代碼的前提下增加額外的功能,裝飾器的返...
    胡一巴閱讀 475評(píng)論 0 0
  • 裝飾器函數(shù) 楔子 作為一個(gè)會(huì)寫函數(shù)的python開發(fā),我們從今天開始要去公司上班了。寫了一個(gè)函數(shù),就交給其他開發(fā)用...
    go以恒閱讀 306評(píng)論 0 0

友情鏈接更多精彩內(nèi)容