溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

淺談Python裝飾器

發(fā)布時(shí)間:2020-07-18 15:41:35 來源:億速云 閱讀:118 作者:小豬 欄目:開發(fā)技術(shù)

小編這次要給大家分享的是淺談Python裝飾器,文章內(nèi)容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。

python函數(shù)式編程之裝飾器

1.開放封閉原則

簡單來說,就是對(duì)擴(kuò)展開放,對(duì)修改封閉。

在面向?qū)ο蟮木幊谭绞街?,?jīng)常會(huì)定義各種函數(shù)。一個(gè)函數(shù)的使用分為定義階段和使用階段,一個(gè)函數(shù)定義完成以后,可能會(huì)在很多位置被調(diào)用。這意味著如果函數(shù)的定義階段代碼被修改,受到影響的地方就會(huì)有很多,此時(shí)很容易因?yàn)橐粋€(gè)小地方的修改而影響整套系統(tǒng)的崩潰,所以對(duì)于現(xiàn)代程序開發(fā)行業(yè)來說,一套系統(tǒng)一旦上線,系統(tǒng)的源代碼就一定不能夠再改動(dòng)了。然而一套系統(tǒng)上線以后,隨著用戶數(shù)量的不斷增加,一定會(huì)為一套系統(tǒng)擴(kuò)展添加新的功能。

此時(shí),又不能修改原有系統(tǒng)的源代碼,又要為原有系統(tǒng)開發(fā)增加新功能,這就是程序開發(fā)行業(yè)的開放封閉原則,這時(shí)就要用到裝飾器了。

2.什么是裝飾器

裝飾器,顧名思義,就是裝飾,修飾別的對(duì)象的一種工具。

所以裝飾器可以是任意可調(diào)用的對(duì)象,被裝飾的對(duì)象也可以是任意可調(diào)用對(duì)象。

3.裝飾器的作用

在不修改被裝飾對(duì)象的源代碼以及調(diào)用方式的前提下為被裝飾對(duì)象添加新功能。

原則:

1.不修改被裝飾對(duì)象的源代碼

2.不修改被裝飾對(duì)象的調(diào)用方式

目標(biāo):

為被裝飾對(duì)象添加新功能。

實(shí)例擴(kuò)展:

import time
# 裝飾器函數(shù)
def wrapper(func):
 def done(*args,**kwargs):
  start_time = time.time()
  func(*args,**kwargs)
  stop_time = time.time()
  print('the func run time is %s' % (stop_time - start_time))
 return done
# 被裝飾函數(shù)1
@wrapper
def test1():
 time.sleep(1)
 print("in the test1")
# 被裝飾函數(shù)2
@wrapper
def test2(name): #1.test2===>wrapper(test2) 2.test2(name)==dome(name)
 time.sleep(2)
 print("in the test2,the arg is %s"%name)
# 調(diào)用
test1()
test2("Hello World")

不含參數(shù)實(shí)例:

import time
user,passwd = 'admin','admin'
def auth(auth_type):
 print("auth func:",auth_type)
 def outer_wrapper(func):
  def wrapper(*args, **kwargs):
   print("wrapper func args:", *args, **kwargs)
   if auth_type == "local":
    username = input("Username:").strip()
    password = input("Password:").strip()
    if user == username and passwd == password:
     print("\033[32;1mUser has passed authentication\033[0m")
     res = func(*args, **kwargs) # from home
     print("---after authenticaion ")
     return res
    else:
     exit("\033[31;1mInvalid username or password\033[0m")
   elif auth_type == "ldap":
    print("ldap鏈接")
  return wrapper
 return outer_wrapper
@auth(auth_type="local") # home = wrapper()
def home():
 print("welcome to home page")
 return "from home"
@auth(auth_type="ldap")
def bbs():
 print("welcome to bbs page"
print(home()) #wrapper()
bbs()

看完這篇關(guān)于淺談Python裝飾器的文章,如果覺得文章內(nèi)容寫得不錯(cuò)的話,可以把它分享出去給更多人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI