Python 閉包和裝飾器 學習筆記

2021-10-08 21:29:46 字數 2885 閱讀 1516

# 外部函式接收姓名引數

defconfig_name

(name)

:# 內部函式儲存外部函式的引數,並且完成資料顯示的組成

definner

(msg)

:print

(name+

": "

+msg)

# 外部函式要返回內部函式

return inner

# 建立閉包物件

tom = config_name(

"tom"

)jane = config_name(

"jane"

)tom(

"hello! jane"

)jane(

"hello! tom"

)

# 定義通用裝飾器

defdecorator

(func)

:# 裝飾器的引數型別為函式,且只有乙個

# 使用裝飾器裝飾已有函式的時候,內部函式的型別和要裝飾的已有函式的型別保持一致

definner

(*args,

**kwargs)

:# 在內部函式對已有函式進行裝飾

print

("正在努力執行加法計算"

)# *args:把元組裡面的每乙個元素,按照位置引數的方式進行傳參

# **kwargs:把字典裡面的每一鍵值對,按照關鍵字的方式進行傳參

# 這裡對元組合字典進行拆包,僅限於結合不定長引數的函式使用

num = func(

*args,

**kwargs)

return num

return inner

@decorator # show=decorator(show)

defshow()

:return

"hello world!"

show = show(

)print

(show)

# 定義p裝飾器

defdecorator_p

(func)

:def

inner()

: p =

""+func()+

""return p

return inner

# 定義div裝飾器

defdecorator_div

(func)

:def

inner()

: div =

""+func()+

""return div

return inner

# 多裝飾器由內向外執行,先執行decorator_p再執行decorator_div

@decorator_div # show=decorator_div(decorator_p(show))

@decorator_p # show=decorator_p(show)

defshow()

:return

"hello world!"

show = show(

)print

(show)

def

return_decorator

(flag)

:def

decorator

(func)

:def

inner

(sum1, sum2)

:if flag ==

"+":

print

("——正在執行加法運算——"

)elif flag ==

"-":

print

("——正在執行減法運算——"

)return func(sum1, sum2)

return inner

return decorator

@return_decorator(

"+")

defsum_add

(num1, num2)

: result = num1 + num2

return result

@return_decorator(

"-")

defsum_sub

(num1, num2)

: result = num1 - num2

return result

sum_add = sum_add(3,

3)print

(sum_add)

sum_sub = sum_sub(6,

3)print

(sum_sub)

# 定義類裝飾器

class

mydecorator

(object):

def__init__

(self, func)

: self.func = func

# 實現__call__這個方法,讓物件變成可呼叫的物件,可呼叫的物件能夠像函式一樣使用

def__call__

(self,

*args,

**kwargs)

:# 對已有函式進行封裝

print()

self.func(

)@mydecorator # @mydecorator => show = mydecorator(show)

defshow()

:print()

# 執行show # 執行mydecorator類建立例項物件 -> show() => 物件()

show(

)

Python 閉包和裝飾器學習

def out func func functools.wraps 可以將原函式物件的指定屬性複製個包裝函式物件 functools.wraps func def inner func func,args,kwargs return func return inner func out func d...

python裝飾器和閉包

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

python閉包和裝飾器

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