1. 程式人生 > 程式設計 >Python閉包裝飾器使用方法彙總

Python閉包裝飾器使用方法彙總

閉包內容:

匿名函式:能夠完成簡單的功能,傳遞這個函式的引用,只有功能

普通函式:能夠完成複雜的功能,傳遞這個函式的引用,只有功能

閉包:能夠完成較為複雜的功能,傳遞這個閉包中的函式以及資料,因此傳遞是功能+資料

物件:能夠完成最複雜的功能,傳遞很多資料+很多功能,因此傳遞的是資料+功能

———————————————————

對全域性函式進行修改:在函式當中加global,在閉包中外邊中的變數加nonlocal

閉包定義:有兩個函式巢狀使用,裡面的函式可以使用外面函式所傳輸的引數,最後可傳遞的是裡面函式的結構與資料(個人理解)。

最後閉包可以在python中引申出裝飾器 ———————————————————

def closure():
  # 在函式內部再定義一個函式,
  # 並且這個函式用到了外邊函式的變數,那麼將這個函式以及用到的一些變數稱之為閉包
  def closure_in(x):
    print('---------我是打不死的%s--------' %x)
  return closure_in
​
x = closure()
x('小強')
​
print('*'*20)
# -----加餐---------
def closure_1(a,b,c):
  def closure_on(x):
    print('-----%s加餐-------' %b)
    print(a*x + c)
  return closure_on
​
demo = closure_1(2,'小強',3) #傳closure_1函式
demo(4) #傳clsure_on函式
​
#注:函式不加括號,呼叫的是函式本身【function】;函式加括號,呼叫的是函式的return結果。

裝飾器內容:

程式碼要遵守‘開放封閉'原則;對已經寫好的函式遵守封閉,對功能擴充套件遵守開放;

# 裝飾器的作用:為了對原來的程式碼上進行擴充套件
def decoration(func):
  def call_func():
    print('-------正在裝飾 -------' )
    func()
  return call_func
​
#@decoration   #--->demo_new = decoration(demo)
def demo():
  print('demo----')
​
demo_new = decoration(demo)
demo_new()

使用裝飾器來測試一個函式的執行時:

import time
def set_func(func):
  def call_func():
    start_time = time.time()
    func()
    stop_func = time.time()
    print(‘alltimes is %f' %(stop_func-start_fun))
  return call_func
@set_func
def test1():
  print(‘——-test1———')
test1()
​
#等價於:
@set_func==test1 = set_func(test1)

1. 沒有引數,沒有返回值的函式進行裝飾:

def set_func(func):
  def call_func():
    print(‘———test2——-')
    print(‘———-test3——')
    func()
  return call_func

@set_func
def test1():
  print(‘——test1——-  ')

2. 對有引數無返回值的函式進行裝飾:

def set_func(func):
  def call_func(a): #變
    print(‘———test2——-')
    print(‘———-test3——')
    func(a) #變
  return call_func

@set_func
def test1(num):
  print(‘——test1——- %d  ' %num)
​
test1(100) —->call_func(100)
test1(200)——>call_func(200)

復現裝飾器原理:

————————————————————————-

只要遇到@函式 裝飾器(這句話),在程式中就已經執行了!!

3. 不定長引數的函式裝飾:

def set_func(func):
  def call_func(*args,**kwargs): #變
    print(‘———test2——-')
    print(‘———-test3——')
    func(*args,**kwargs) #(拆包)將元祖拆開,每個進行傳輸;
    #func(args,kwargs)—>不行,相當於傳遞了兩個引數:一個元祖,一個字典。
  return call_func
@set_func
def test1(num,*args,**kwargs):
  print(‘——test1——- %d  ' %num)
  print(‘——test1——-  ',args)
  print(‘——test1——- ',kwargs )
test1(100)
test1(100,200)
test1(100,200,300,mm=100)

注意:*args儲存不定長引數,以元祖儲存,**kwargs儲存字典形式(mm=...)

4.對應的返回值引數進行裝飾、通用裝飾器:

#通用裝飾器
def set_func(func):
  print(“開始進行裝飾———-”)
  def call_func(*args,**kwargs): #變
    print(‘———test2——-')
    print(‘———-test3——')
    return func(*args,**kwargs) #(拆包)將元祖拆開,每個進行傳輸;如果沒有return ret返回none。
    #func(args,kwargs)—>不行,相當於傳遞了兩個引數:一個元祖,一個字典。
  return call_func

@set_func
def test1(num,kwargs )
  return ‘ok'  #—-返回給上面的func(),然後return func—ret
ret = test1(100)

5. 多個裝飾器對同一個函式進行裝飾:

def add_qx(func):
  print(“——開始進行裝飾許可權1———-”)
  def call_func(*args,**kwargs): #變
    print(‘這是許可權驗證1')
    return func(*args,**kwargs)
  return call_func

​
def add_xx(func):
  print(“——開始進行裝飾xx功能———-”)
  def call_func(*args,**kwargs): #變
    print(‘這是xx許可權驗證')
    return func(*args,**kwargs)
  return call_func
@add_qx
@add_xx
def test1():
  print(‘——test1——-')
test1()

首先執行第一個,但是第一個裝飾器下面不是函式(裝飾器原則:下面必須是函式,否則不執行),所以第一個函式先等待,等第二個裝飾器執行後形成函式在交給第一個裝飾器;所以執行結果是:

開始進行裝飾xx的功能,

開始進行裝飾許可權1,

這是許可權驗證1,

這是xx許可權驗證,

——-test1——-,

——————裝飾器練習—————- 輸出格式:<td><h1>haha</h1></td>

def set_func_1(func):
  def call_func():
    return ‘<h1>' + func() + '</h1>'
  return call_func

​
def set_func_2(func):
  def call_func():
    return ‘<td>' + func() + '</td>'
  return call_func

@set_func_1()
@set_func_2()
def get_str():
  return ‘haha'

print(get_str())
最後執行的效果: <h1><td>haha</td></h1>

6. 用類對函式進行裝飾(瞭解):

class Test(object):
  def __init__(self,func):
    self.func = fun

  def __call__(self):
    print(‘這裡是裝飾器的功能。。。。')
    return self.func()

@Test
def get_str():
  return ‘haha'

print(get_str())

以上就是裝飾器與閉包的全部內容

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。