裝飾器之起飛版

2022-09-22 19:22:23 字數 3103 閱讀 9801

原則:

裝飾器去裝飾一個函式 :不改變被裝飾函式的源**,不改變被裝飾函式的呼叫方式

#

基礎形態 **********這才是終極版************

func函式物件 ---> 被裝飾物件

#*args, **kwargs用於接收被裝飾物件的引數

def inner(*args, **kwargs):

#在呼叫被裝飾物件前 新增新功能 @beforemethod

res = func(*args, **kwargs) # 被裝飾函式

#在呼叫被裝飾物件後 新增新功能 @aftermethod

return

res

return

inner

defsleep():

print('

111'

)sleep() =inner()

#sleep() = 裝飾器裡面的inner() ,

sleep()

總結:1.被裝飾裝飾過的函式:呼叫被裝飾函式時  就是在呼叫裝飾器裡面的inner()       

2. 可以在被裝飾物件前加新功能,也可以在被裝飾函式後面加新功能

3.不改變被裝飾函式的呼叫方式:1.不改變原函式名 2.不改變被呼叫函式的引數

4. 如果裝飾中沒有增加任何新功能只有被裝飾的函式,這裡叫作空裝飾器,呼叫被空裝飾其裝飾的函式時,相當於直接執行被裝飾的函式

5. 當裝飾器中沒有被裝飾的函式res = func(*args,**kwargs) 時,只會執行裝飾器中的**,不會再呼叫被裝飾的函式         

def

def inner1(*args, **kwargs):

print('

1---start')

#被裝飾物件在呼叫時,如果還有其他裝飾器,會先執行其他裝飾器中的inner

#inner2

#res = func(*args, **kwargs) 被裝飾函式

print('

1---end')

#return res

return

inner1##

#def index(): #

被裝飾物件 # inner1 ---》

print('

from index...')

index()

1---start

from

index...

1---end

2.疊加裝飾器

def

def inner1(*args, **kwargs):

print('

1---start')

#被裝飾物件在呼叫時,如果還有其他裝飾器,會先執行其他裝飾器中的inner

#inner2

res = func(*args, **kwargs)

print('

1---end')

return

res

return

inner1

def

def inner2(*args, **kwargs):

print('

2---start')

res = func(*args, **kwargs)

print('

2---end')

return

res

return

inner2

def

def inner3(*args, **kwargs):

print('

3---start')

res = func(*args, **kwargs)

print('

3---end')

return

res

return

inner3

'''疊加裝飾器的裝飾順序與執行順序:

由下往上裝飾

- 執行順序: 呼叫裝飾過後的返回值inner

由上往下執行

'''#

def index(): #

被裝飾物件 # inner1 ---》

print('

from index...

')

index()

>>> 1---start

>>> 2---start

>>> 3---start

>>> from index...

>>> 3---end

>>> 2---end

>>> 1---end

總結:從下往上裝飾,從上往下執行,一層包一層

3.有參裝飾器  @user_auth('svip')   加一層函式傳參去判斷 使用者型別

#

有參裝飾器

def user_auth(user_role): #

'svip'

def

def inner(*args, **kwargs):

if user_role == '

svip':

print('前超級使用者')

#新增超級使用者的功能

res = func(*args, **kwargs)

print('後超級使用者')

return

res

elif user_role == '

普通使用者':

print('

普通使用者')

#新增普通使用者的功能

res = func(*args, **kwargs)

return

res

return

inner

return

#被裝飾物件

#@user_auth('svip')

普通使用者')

#def

index():

print('被裝飾函式')

index()

>>> 前超級使用者

>>> 被裝飾函式

>>> 後超級使用者

C 簡單版STL list 連結串列(迭代器版)

最近課程開始上設計模式了。 苦於天天滿課的狀態,不過題目可以放到晚上去刷。 週末師大校賽挺有趣的,題目 高。 花了幾天寫list 一開始就想...

於神之怒加強版

求 sum n sum m i j k 多組詢問,但是每次的 k 都是不變的 先是套路 f n sum n sum m i j n f n...

ubuntu伺服器版相關命令

經常遇到一些命令使用上的問題現記錄下 1 ubuntu中dns修改命令 etc resolvconf resolv conf d base...