閉包與裝飾器 Python

2021-09-25 10:21:29 字數 1470 閱讀 9495

兩層函式巢狀,內層函式用到了外層函式的引數,外部函式的變數和內部函式的整體稱為閉包,可以作為引數進行傳遞,傳遞時不僅傳遞函式功能,也傳遞引數

閉包是裝飾器的實現原理

def test1(num):

def test2():

nonlocal num

print(num)

num = 100

print(num)

return test2

t1 = test1(3)

t1()

函式/匿名函式/閉包/物件,當作實參時有什麼區別?

1.匿名函式,能夠完成基本簡單功能,傳遞函式的引用,只有功能

2.普通函式,能完成複雜的功能,傳迪函式的引用

3.閉包,較為複雜的功能,能夠傳遞功能和資料

4.物件,能完成最為複雜的功能,傳遞很多資料和很多功能

裝飾器

#coding=utf-8

def set_func(func):

def call_func():

print("新增的裝飾器的功能**1")

print("新增的裝飾器的功能**2")

return func() # 相當與把被裝飾的函式拉了進來,使用return使裝飾器通用

return call_func

@set_func

def sunny():

print("today is sunny!")

sunny()

裝飾器用到了閉包,內層函式共享外層函式引數,和函式引用作為引數的特點

多個裝飾器裝飾的順序

@set_func0

@set_func1

@set_func2

def sunny():

print("today is sunny!gfsdf")

func2 --> func1 --> func0 --> func0 --> func1 --> func2 --> sunny

類裝飾器

class test(object):

def __init__(self,func):

self.func = func

print("新增的裝飾器的功能**ttttttttt")

def __call__(self, *args, **kwargs):

print("新增的裝飾器的功能**teeeessssssttttt")

return self.func() # 相當與把被裝飾的函式拉了進來

@test

def sunny():

print("today is sunny!gfsdf")

python閉包與裝飾器

首先閉包函式我的理解是,乙個函式內可以巢狀定義乙個函式,並將巢狀定義的函式返回 如果不返回執行完函式物件也就銷毀了 巢狀函式可以接收外部函式的引數,不同引數就可以變更巢狀函式的功能,返回不同功能的巢狀函式物件。以下是閉包函式簡單示例,如果inner函式不接收outer的引數x也就沒有意義了,一定要返...

Python閉包與裝飾器

一.閉包 如果乙個內嵌函式中引用了外部函式中的變數 非全域性變數 那麼該內嵌函式稱之為閉包 也就是將組成函式的語句和這些語句的執行環境打包在一起時,得到的物件 閉包滿足的三個條件 1.必須是內嵌函式 2.外層函式返回值是內嵌函式 3.內嵌函式引用外層函式變數 def funx x def funy ...

Python 閉包與裝飾器

在函式內部再定義乙個函式,並且內部這個函式用到了外邊函式的變數,那麼將內部函式以及用到的一些變數稱之為閉包。兩個函式巢狀,外層函式返回內層函式的引用,外層函式必須傳引數 外層函式不傳參相當於只定義內層函式,沒有什麼用。注意點 由於閉包引用了外部函式的區域性變數,則外部函式的區域性變數沒有及時釋放,消...