Python 閉包和裝飾器

2021-08-21 18:45:17 字數 4189 閱讀 6923

裝飾器函式裝飾器

類裝飾器

functools.wraps()

簡介

def

outer_func

(number):

definner_func

(inner_number):

return number + inner_number

return inner_func

# 給外部函式複製,20傳遞給number,並返回內部函式

fun = outer_func(20)

print(fun(100)) # 120

print(fun(200)) # 220

簡介

被裝飾物件為類

裝飾器為類

普通方式

def

fun(test):

definner

(): print('inner')

test()

return inner

deffun1

(): print('func1')

deffun2

(): print('func2')

fun_test = fun(fun1)

fun_test()

fun_test = fun(fun2)

fun_test()

輸出資訊:

inner

func1

inner

func2

函式裝飾器

無參裝飾器

def

decorator

(func):

definner

(): print('開始處理資料')

func()

print('資料處理完畢')

return inner

@decorator

deffunc

(): print('正在處理資料')

func()

輸出資訊:

開始處理資料

正在處理資料

資料處理完畢

帶參裝飾器:被裝飾物件帶參
def

decorator

(func):

definner

(x, y):

print('開始處理資料')

result = func(x, y)

print('資料處理完畢')

return result

return inner

@decorator

deffunc

(a, b):

print('正在處理資料')

return a * b

result = func(2, 3)

print(result)

輸出資訊:

開始處理資料

正在處理資料

資料處理完畢

6

帶參裝飾器:被裝飾物件不定長引數
def

decorator

(func):

definner

(*args, **kwargs):

print("開始處理資料")

result = func(*args, **kwargs)

print("資料處理完畢")

return result

return inner

@decorator

deffunc1

(a, b):

print('正在處理...')

return

"%s-%s" % (a, b)

@decorator

deffunc2

(a, b, c):

print('正在處理...')

return

"%s,%s,%s" % (a, b, c)

result1 = func2('a', 'b', 'c')

print('返回資料:', result1)

result2 = func1("a", "b")

print('返回資料:', result2)

輸出資訊:

開始處理資料

正在處理...

資料處理完畢

返回資料: a,b,c

開始處理資料

正在處理...

資料處理完畢

返回資料: a-b

帶參裝飾器:裝飾器帶參
def

decorator

(arg):

# 裝飾器引數

defmiddle

(func):

definner

(x, y):

print("開始資料處理")

x *= arg

y *= arg

result = func(x, y)

print("資料處理完畢")

return result

return inner

return middle

@decorator(10)

deffunc

(a, b):

print('正在處理資料...')

return a * b

result = func(3, 4)

print(result)

輸出資訊:

開始資料處理

正在處理資料...

資料處理完畢

1200

類裝飾器
class

decorator:

def__init__

(self, func):

self.func = func

def__call__

(self, *args, **kwargs):

print('開始處理資料')

self.func()

print('資料處理完畢')

@decorator

deffun

(): print('資料處理中。。。')

fun()

輸出資訊:

開始處理資料

資料處理中。。。

資料處理完畢

functools.wraps()

例如:

def

decorator

(func):

definner

():"""

inner函式

:return:

"""pass

return inner

@decorator

deffunc

():"""

被裝飾函式

:return:

"""pass

print(func.__name__)

print(func.__doc__)

輸出資訊:

inner

inner函式

:return:

由此可見,被裝飾的func的函式資訊丟失了,解決這個問題可以使用functools.wraps()函式

import functools

defdecorator

(func):

# func的屬性繫結

@functools.wraps(func)

definner

():"""

inner函式

:return:

"""pass

return inner

@decorator

deffunc

():"""

被裝飾函式

:return:

"""pass

print(func.__name__)

print(func.__doc__)

輸出資訊:

func

被裝飾函式

:return:

未完待續。。。

python裝飾器和閉包

下面幾個部落格有裝飾器的講解,也包含了裝飾器幾種情況的例子,比如說被裝飾的函式帶引數,裝飾器本身帶引數等。理解python中的裝飾器 python裝飾器學習 例子 其實裝飾器跟設計模式中的裝飾器模式基本一樣,就是在已有的函式上新增新的功能,這也是自己對裝飾器的一點簡陋的理解了。下面是自己寫的簡單例子...

python閉包和裝飾器

要理解裝飾器,就要明白閉包 要明白閉包,首先就要從高階函式和作用域說起 說道作用域,一般會談到legb規則。所謂的legb l locals,當前命名空間 區域性作用域 e enclosing,外部函式的命名空間 外部作用域 g global,全域性的命名空間 b bulit in,內建的命名空間平...

python 閉包和裝飾器

閉包的寫法,兩層函式的巢狀,外部函式返回內部函式的引用,外層函式都帶引數 def 外層函式的名稱 引數 def 內層函式的名稱 pass return 內層函式的引用 def set fun func func 254 defcall fun nonlocal func 修改外層函式的值,並且內部函...