python裝飾器(符號 )示例

2021-10-07 12:50:59 字數 4891 閱讀 6666

3. reference

購物車場景,有兩個函式get_nameget_info,已實現

def

get_name

(sess)

: name = sess[

'name'

]return name

defget_info

(sess)

: info = sess[

'info'

]return info

假設現在接到乙個需求,需驗證登入後才能獲取name和info。如果我們在已有原始碼上直接修改,即新增if語句,這會違反開閉原則(對擴充套件開放,對修改關閉)。這裡介紹python開發模式中一款強大的工具——裝飾器(24種開發模式就是強大)。

直接用**實現,有

def

get_name

(sess)

: name = sess[

'name'

]return name

defget_info

(sess)

: info = sess[

'info'

]return info

def(func, sess)

: is_login = sess[

'is_login'

]if is_login:

return func(sess)

else

:return

none

def(func, sess)

: level = sess[

'level'

]if level >5:

return func(sess)

else

:return

none

if __name__ ==

'__main__'

:# 接到需求1:需驗證是否登入

sess =

print

(name)

sess =

print

(name)

# 中途改需求,接到需求2:轉為需驗證等級

sess =

print

(name)

sess =

print

(name)

執行結果:使用更加簡便的寫法,有

from functools import wraps

def(func)

: @wraps(func)

def_check

(*args,

**kwargs)

:# print(args)

# print(type(args))

# print(type(args[0]))

sess = args[0]

if sess[

'is_login']:

return func(

*args,

**kwargs)

else

:return

none

return _check

defget_name

(sess)

: name = sess[

'name'

]return name

defget_info

(sess)

: info = sess[

'info'

]return info

if __name__ ==

'__main__'

: sess =

print

(get_name(sess)

)print

(get_info(sess)

) sess =

print

(get_name(sess)

)print

(get_info(sess)

)

執行結果:get_***函式不帶引數,有

def

(func)

:def

_check()

:print

('write to log.txt'

, func.__name__)

# 記錄到日誌裡

return func(

)return _check

defget_name()

:return

'name'

defget_info()

:return

'info'

if __name__ ==

'__main__'

:print

(get_name())

print

(get_info(

))

執行結果:

write to log.txt get_name

name

write to log.txt get_info

info

符號@的裝飾器可以帶引數,有

def

(log_path)

:def

(func)

:def

_check

(sess)

:print

(log_path, end=

'\t'

)if sess[

'is_login']:

return func(sess)

else

:return

none

return _check

def(func)

:def

_check

(sess)

:if sess[

'level'

]>=3:

return func(sess)

else

:return

none

return _check

# 呼叫get_name方法時記錄到log_name.txt日誌中去

'd:/log_name.txt'

)def

get_name

(sess)

: name = sess[

'name'

]return name

# 接到新需求,呼叫get_info方法時需同時驗證登入和等級

)def

get_info

(sess)

: info = sess[

'info'

]return info

if __name__ ==

'__main__'

:print()

sess =

print

(get_name(sess)

)print

(get_info(sess)

)print()

sess =

print

(get_name(sess)

)print

(get_info(sess)

)print()

sess =

print

(get_name(sess)

)print

(get_info(sess)

)print

()

執行結果:

其實上述用法等價於

def

(log_path)

:def

(func)

:def

_check

(sess)

:print

(log_path, end=

'\t'

)if sess[

'is_login']:

return func(sess)

else

:return

none

return _check

def(func)

:def

_check

(sess)

:if sess[

'level'

]>=3:

return func(sess)

else

:return

none

return _check

defget_name

(sess)

: name = sess[

'name'

]return name

defget_info

(sess)

: info = sess[

'info'

]return info

if __name__ ==

'__main__'

: sess =

'e:/log_name.txt'

)(get_name)

print

(get_name_1(sess)

)'e:/log_info.txt'

)(get_info_1)

print

(get_info_1(sess)

)

執行結果:python函式修飾符@的使用

手把手帶你學會python

python裝飾器示例

目標 1.編寫執行函式,生成10個數的列表,沒生成乙個睡眠一會 2.編寫裝飾器,完成函式耗時計算 1.編寫生成10個數的列表,並睡眠0.2s import time def loop result for i in range 10 time.sleep 0.2 return result 乙個.p...

裝飾器示例

接收的時候是聚合 呼叫的時候打散 def def inner args,kwargs print 在裝飾器的函式執行之前 ret func args,kwargs print 在之後 return ret return inner defholidary day print 全天放假 s day r...

python 驗證功能的裝飾器示例

user list current dict defauth auth type defauth func func print 認證型別 auth type if auth type filedb if current dict username and current dict login 判斷...