1. 程式人生 > 實用技巧 >爬取必應首頁大圖 - PHP

爬取必應首頁大圖 - PHP

更多python教程請到: 菜鳥教程www.piaodoo.com

人人影視www.sfkyty.com

16影視www.591319.com

星辰影院www.591319.com


本文例項講述了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程式設計有所幫助。