真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python裝飾器decorator怎么用-創(chuàng)新互聯(lián)

這篇文章主要介紹Python裝飾器decorator怎么用,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

創(chuàng)新互聯(lián)專注于五河企業(yè)網(wǎng)站建設,響應式網(wǎng)站,商城網(wǎng)站建設。五河網(wǎng)站建設公司,為五河等地區(qū)提供建站服務。全流程按需網(wǎng)站建設,專業(yè)設計,全程項目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務

什么是裝飾器(decorator)

簡單來說,可以把裝飾器理解為一個包裝函數(shù)的函數(shù),它一般將傳入的函數(shù)或者是類做一定的處理,返回修改之后的對象.所以,我們能夠在不修改原函數(shù)的基礎上,在執(zhí)行原函數(shù)前后執(zhí)行別的代碼.比較常用的場景有日志插入,事務處理等.

裝飾器

最簡單的函數(shù),返回兩個數(shù)的和

def calc_add(a, b):
 return a + b
calc_add(1, 2)

但是現(xiàn)在又有新的需求,計算求和操作耗時,很簡單,求和前獲取一下時間,求和后再獲取一次,求差即可

import datetime
def calc_add(a, b):
 start_time = datetime.datetime.now()
 result = a + b
 end_tiem = datetime.datetime.now()
 print "result:", result, "used:", (end_tiem - start_time).microseconds, "μs"
 return result
calc_add(1, 2)

現(xiàn)在呢,函數(shù)calc_diff(a, b),計算a-b,也想計算減法操作的時間差,很好辦,把那段代碼復制過去.但是假如我們現(xiàn)在想編的是一個數(shù)學函數(shù)庫,各種函數(shù)都想計算其執(zhí)行耗時,總不能一個一個復制代碼,想個更好的辦法.

我們知道,在Python中函數(shù)也是被視為對象的,可以作為參數(shù)傳遞,那么假如把計算耗時的獨立為一個單獨的函數(shù)calc_spend_time(),然后把需要計算耗時的函數(shù)例如calc_add的引用傳遞給它,在calc_spend_time中調(diào)用calc_add,這樣所有的需要計算耗時的函數(shù)都不用修改自己的代碼了.

def calc_spend_time(func, *args, **kargs):
 start_time = datetime.datetime.now()
 result = func(*args, **kargs)
 end_tiem = datetime.datetime.now()
 print "result:", result, "used:", (end_tiem - start_time).microseconds, "μs"
def calc_add(a, b):
 return a + b
calc_spend_time(calc_add, 1, 1)
# calc_spend_time(calc_add, a=1, b=2)

看起來也不錯,負責計算的函數(shù)不用更改,只需調(diào)用的時候作為參數(shù)傳給計算時間差的函數(shù).但就是這,調(diào)用的時候形式變了,不再是clac(1, 2),而是calc_spend_time(clac_add, 1, 2),萬一calc_add大規(guī)模被調(diào)用,那么還得一處一處找,然后修改過來,還是很麻煩.如果想不修改代碼,就得使clac()calc_spend_time(clac)效果一樣,那么可以在calc_spend_time()里把傳入的clac包裝一下,然后返回包裝后的新的函數(shù),再把返回的包裝好的函數(shù)賦給clac,那么calc()的效果就和上例calc_spend_time(calc())效果一樣.

import datetime
def calc_spend_time(func):
 def new_func(a, b):
  start_time = datetime.datetime.now()
  result = func(a, b)
  end_tiem = datetime.datetime.now()
  print "result:", result, "used:", (end_tiem - start_time).microseconds, "μs"
 return new_func
def calc_add(a, b):
 return a + b
calc_add = calc_spend_time(calc_add)
calc_add(1, 2)

語法糖

上面的例子就是裝飾器的概念,包裝函數(shù)的函數(shù).事實上上面的例子還可以更精簡

import datetime
def calc_spend_time(func):
 def new_func(a, b):
  start_time = datetime.datetime.now()
  result = func(a, b)
  end_tiem = datetime.datetime.now()
  print "result:", result, "used:", (end_tiem - start_time).microseconds, "μs"
 return new_func
@calc_spend_time
def calc_add(a, b):
 return a + b
calc_add(1, 2)

@calc_spend_time就是語法糖,它的本質(zhì)就是:calc_add = calc_spend_time(calc_add)

無參數(shù)的函數(shù)裝飾器

import datetime
def calc_spend_time(func):
 def new_func(*args, **kargs):
  start_time = datetime.datetime.now()
  result = func(*args, **kargs)
  end_tiem = datetime.datetime.now()
  print "result:", result, "used:", (end_tiem - start_time).microseconds, "μs"
 return new_func
@calc_spend_time
def calc_add(a, b):
 return a + b
@calc_spend_time
def calc_diff(a, b):
 return a - b
calc_add(a=1, b=2)
calc_diff(1, 2)

注:

*args:把所有的參數(shù)按出現(xiàn)順序打包成list
**kargs:把所有的key=value形式的參數(shù)打包成一個dict

帶參數(shù)的函數(shù)裝飾器

假如我們需要知道函數(shù)的一些額外信息,例如函數(shù)作者,可以通過給裝飾器函數(shù)增加參數(shù)來實現(xiàn).

import datetime
def calc_spend_time(author):
 def first_deco(func):
  def new_func(*args, **kargs):
   start_time = datetime.datetime.now()
   result = func(*args, **kargs)
   end_tiem = datetime.datetime.now()
   print author, "result:", result, "used:", (end_tiem - start_time).microseconds, "μs"
  return new_func
 return first_deco
@calc_spend_time('author_1')
def calc_add(a, b):
 return a + b
@calc_spend_time('author_2')
def calc_diff(a, b):
 return a - b
calc_add(a=1, b=2)
calc_diff(1, 2)

Python內(nèi)置裝飾器

Python內(nèi)置的裝飾器有三個:staticmethod,classmethodproperty

staticmethod:把類中的方法定義為靜態(tài)方法,使用staticmethod裝飾的方法可以使用類或者類的實例對象來調(diào)用,不需要傳入self

class Human(object):
 """docstring for Human"""
 def __init__(self):
  super(Human, self).__init__()
 @staticmethod
 def say(message):
  if not message:
   message = 'hello'
  print 'I say %s' % message
 def speak(self, message):
  self.say(message)
Human.say(None)
human = Human()
human.speak('hi')

輸出:

I say hello
I say hi

classmethod:把類中的方法定義為類方法,使用classmethod裝飾的方法可以使用類或者類的實例對象來調(diào)用,并將該class對象隱式的作為第一個參數(shù)傳入

class Human(object):
 """docstring for Human"""
 def __init__(self):
  super(Human, self).__init__()
  self.message = '111'
 def say(message):
  if not message:
   message = 'hello'
  print 'I say %s' % message
 @classmethod
 def speak(cls, message):
  if not message:
   message = 'hello'
  cls.say(message)
human = Human()
human.speak('hi')

輸出同上例

property:把方法變成屬性

class Human(object):
 """docstring for Human"""
 def __init__(self, value):
  super(Human, self).__init__()
  self._age = value
 @property
 def age(self):
  return self._age
human = Human(20)
print human.age

以上是“Python裝飾器decorator怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關知識,歡迎關注創(chuàng)新互聯(lián)成都網(wǎng)站設計公司行業(yè)資訊頻道!

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。


網(wǎng)頁題目:Python裝飾器decorator怎么用-創(chuàng)新互聯(lián)
URL網(wǎng)址:http://weahome.cn/article/dhegdc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部