91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python裝飾器原理與基本用法分析

發布時間:2020-08-25 11:08:03 來源:腳本之家 閱讀:170 作者:隨風行云 欄目:開發技術

本文實例講述了Python裝飾器原理與基本用法。分享給大家供大家參考,具體如下:

裝飾器:

意義:在不能改變原函數的源代碼,和在不改變整個項目中原函數的調用方式的情況下,給函數添加新的功能

由于不允許改變函數的源代碼,在忽略調用方式的情況下,我們可能會有以下結果:

def decorator(func):
  func()
  print("logging")
def test1():
  print("test1")
def test2():
  print("Test2")
decorator(test1)
decorator(test2)

但這改變了原本的調用方式,原本是test1(),現在是decorator(test1)

那么如果我們為了使調用方式不變,是否可以使裝飾好的函數decorator的返回值是一個我們需要的函數,再賦值給原來的函數名呢?

于是:

def timmer1(func):
  def warpper():
    start_time = time.time()
    func()
    stop_time=time.time()
    print("the func run time is %s"%(stop_time-start_time))
   return warpper
test3=timmer1(test3)

好像上面這段代碼并沒有改變原來的調用方式,調用原來的test3,相當于運行timmer1中的warpper

如果對于無參數的函數來說,上面的代碼已經實現了我們的目的,但對于帶參數的函數,上面的代碼沒有傳入參數,所以仍然需要修改

于是:

def timmer2(func):
  def warpper(*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 warpper

在上上面的代碼中,由于實質上,test3已經等于wrapper,所以可以直接使用,test3(參數)來傳入參數,為了處理參數不確定數量問題,可以使用可變長度參數

上面代碼還存在一個問題,無法獲取原本函數中的返回值,那么我們還需要加上一些東西:

import time
def timmer2(func):
  def warpper(*args,**kwargs):
    start_time = time.time()
    res=func(*args,**kwargs)
    return res
    stop_time=time.time()
    print("the func run time is %s"%(stop_time-start_time))
  return warpper

使用一個變量記錄下原函數的返回值。

這樣我們就實現了裝飾器的基本功能。

補充:

python提供了一個功能:

@裝飾器名
def 目標裝飾函數名():
  pass
#上面的效果是 目標裝飾函數名=裝飾器(目標裝飾函數名)

所以在需要替換原函數的時候,可以在目標裝飾函數定義的上一行加上@裝飾器名

所以上面的代碼會變成:

def timmer2(func):
  def warpper(*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 warpper
@timmer2
def test7():
  print("test7")
@timmer2
def test6(x):
  print(x)
test7()
test6(2)

import time
def timmer2(func):
  def warpper(*args,**kwargs):
    start_time = time.time()
    res=func(*args,**kwargs)
    return res
    stop_time=time.time()
    print("the func run time is %s"%(stop_time-start_time))
  return warpper
@timmer2
def test4():
  print("test4 run")
  return "test4 done"
test4()
print("--------")
print(test4())

第二個補充:

可以一個函數,可以使用多個裝飾器

比如:

@裝飾器1

@裝飾器2

更多關于Python相關內容感興趣的讀者可查看本站專題:《Python面向對象程序設計入門與進階教程》、《Python數據結構與算法教程》、《Python函數使用技巧總結》、《Python字符串操作技巧匯總》、《Python編碼操作技巧總結》及《Python入門與進階經典教程》

希望本文所述對大家Python程序設計有所幫助。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

石泉县| 长丰县| 清水河县| 海原县| 绥江县| 汨罗市| 根河市| 资源县| 怀安县| 封丘县| 青川县| 科技| 灵武市| 杭州市| 抚州市| 曲靖市| 隆子县| 嘉峪关市| 克东县| 凤凰县| 连云港市| 清流县| 股票| 高雄市| 遂平县| 永靖县| 鄄城县| 内丘县| 扬中市| 延川县| 安义县| 攀枝花市| 曲周县| 湘乡市| 兰州市| 通道| 北辰区| 石狮市| 获嘉县| 鹿邑县| 罗江县|