閉包 裝飾器 總結

2022-05-29 03:36:19 字數 4014 閱讀 4618

1.閉包:

函式內部的子函式返回,在外部呼叫子函式時,其實函式已經結束,但是在呼叫子函式時,函式內部的區域性變數任然有效。

1 def fun():

2 n = 10

3 def fun1():

4 print('n為:', n)

5 return fun1

6 7 f = fun()

8 print(f)

9 f()

10 11 .fun1 at 0x000001df0e6dfa60>

12 n為: 10

2.裝飾器:

參考:軟體開發的乙個原則:開放-封閉 原則

開放:對現有功能的擴充套件開放

封閉:已實現的功能**塊不應該被修改

# 對河南和歐美專區認證,若是已經登入過,就不需要在登入。

# 2.1.語法糖 裝飾器 

user_state = false

def login(func):

def inner():

_username = 'alice'

_password = '123'

global user_state

if user_state == false:

username = input('username:').strip()

password = input('password:').strip()

if username == _username and password == _password:

print('welcome to login...')

user_state = true

else:

print('wrong username or password')

else:

print('使用者已經登入,認證通過')

if user_state == true:

func()

return inner

def home():

print('-----首頁-----')

@login # america=login(america)

def america():

print('-----歐美專區-----')

def japan():

print('-----日韓專區-----')

@login # henan=login(henan)

def henan():

print('-----河南專區-----')

home()

henan()

america()

-----首頁-----

username:alice

password:123

welcome to login...

-----河南專區-----

使用者已經登入,認證通過

-----歐美專區-----

語法糖 裝飾器

# 2.2.帶引數的裝飾器

user_state = false

def login(func):

def inner(*args, **kwargs):

_username = 'alice'

_password = '123'

global user_state

if user_state == false:

username = input('username:').strip()

password = input('password:').strip()

if username == _username and password == _password:

print('welcome to login...')

user_state = true

else:

print('wrong username or password')

else:

print('使用者已經登入,認證通過')

if user_state == true:

func(*args, **kwargs)

return inner

def home():

print('-----首頁-----')

@login

def america():

print('-----歐美專區-----')

@login

def japan(x, y, z=5):

print('-----日韓專區-----', x, y, z)

@login

def henan(x):

print('-----河南專區-----', x)

home()

henan('haha')

america()

japan('japan', 1, z=7)

-----首頁-----

username:alice

password:123

welcome to login...

-----河南專區----- haha

使用者已經登入,認證通過

-----歐美專區-----

使用者已經登入,認證通過

-----日韓專區----- japan 1 7

帶引數的裝飾器

# 2.3.帶引數2的裝飾器

user_state = false

def login(auth_type):

def outer(func):

def inner(*args, **kwargs):

_username = 'alice'

_password = '123'

global user_state

if user_state == false:

username = input('username:').strip()

password = input('password:').strip()

if username == _username and password == _password:

print('welcome to login...')

user_state = true

else:

print('wrong username or password')

else:

print('使用者已經登入,認證通過')

if user_state == true:

func(*args, **kwargs)

return inner

return outer

def home():

print('-----首頁-----')

@login('wx')

def america():

print('-----歐美專區-----')

@login('wb')

def japan(x, y, z=5):

print('-----日韓專區-----', x, y, z)

@login('qq') #henan = login('qq')(henan) =inner

def henan(x):

print('-----河南專區-----', x)

home()

# xx = login('qq')

# henan = xx(henan)

henan('haha')

america()

japan('japan', 1, z=7)

-----首頁-----

username:alice

password:123

welcome to login...

-----河南專區----- haha

使用者已經登入,認證通過

-----歐美專區-----

使用者已經登入,認證通過

-----日韓專區----- japan 1 7

帶引數2的裝飾器

閉包 裝飾器

外部函式返回內部函式的引用 內部函式可以直接使用外部函式的環境變數 語法 外部函式通過返回內部函式的引用 內部函式可以直接使用外部函式的 環境變數 自由變數 函式執行時間統計 執行函式前預備處理 執行函式後清理功能 許可權校驗等場景 快取有且只有乙個引數 指向了被裝飾的函式的引用 使用裝飾器 裝飾器...

閉包,裝飾器

多層函式巢狀,函式裡面還有定義函式,一般是兩個 往往內層函式會用到外層函式的變數,把內層函式以及外部函式的變數當成乙個特殊的物件,這就是閉包。閉包比物件導向更純淨 更輕量,既有資料又有執行資料的 比普通函式功能更強大,不僅有 還有資料 利用閉包的基本原理,對乙個目標函式進行裝飾,即在執行乙個目標函式...

閉包 裝飾器

定義乙個函式 def test number 在函式內部再定義乙個函式,並且這個函式用到了外邊函式的變數,那麼將這個函式及用到的一些變數稱之為閉包 def test in number in print in text in 函式,number in is d number in return nu...