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

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

python的修飾器是什么-創(chuàng)新互聯(lián)

創(chuàng)新互聯(lián)www.cdcxhl.cn八線動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買多久送多久,劃算不套路!

成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供四方臺(tái)企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站建設(shè)、做網(wǎng)站、H5響應(yīng)式網(wǎng)站、小程序制作等業(yè)務(wù)。10年已為四方臺(tái)眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進(jìn)行中。

小編給大家分享一下python的修飾器是什么,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

python的修飾器本質(zhì)上是一個(gè)python函數(shù),它可以讓其他函數(shù)在不需要做任何代碼變動(dòng)的前提下增加額外功能,修飾器的返回值是一個(gè)函數(shù)對(duì)象。

python的修飾器是什么

裝飾器是一個(gè)很著名的設(shè)計(jì)模式,經(jīng)常被用于有切面需求的場(chǎng)景,較為經(jīng)典的有插入日志、性能測(cè)試、事務(wù)處理等。裝飾器是解決這類問題的絕佳設(shè)計(jì),有了裝飾器,我們就可以抽離出大量函數(shù)中與函數(shù)功能本身無關(guān)的雷同代碼并繼續(xù)重用。概括的講,裝飾器的作用就是為已經(jīng)存在的對(duì)象添加額外的功能。

功能

我們首先從一個(gè)簡(jiǎn)單的例子說起,這個(gè)例子是stackflow上的一個(gè)問題,如何通過使用如下的代碼實(shí)現(xiàn)輸出Hello:

@makebold  @makeitalic  def say():  
   return "Hello"

先看一下答案:

def makebold(fn):  
    def wrapped():  
        return "" + fn() + ""  
    return wrapped  
   
def makeitalic(fn):  
    def wrapped():  
        return "" + fn() + ""  
    return wrapped  
  
@makebold  
@makeitalic  
def hello():  
    return "hello world"  
     print hello()
     #返回 hello world

這里的@makebold和@makeitalic似乎給Hello加上了一層包裝(or修飾),這就是修飾器最明顯的體現(xiàn)。

從需求談起

初期,我寫了一個(gè)函數(shù)

def foo():  
    print 'in foo()'  foo()

為了檢查這個(gè)函數(shù)的復(fù)雜度(在網(wǎng)絡(luò)編程中程序的延時(shí)還是很重要的),需要測(cè)算運(yùn)算時(shí)間,增加了計(jì)算時(shí)間的功能有了下面的代碼:

import time  
def foo():  
    start = time.clock()  
    print 'in foo()'  
    end = time.clock()  
    print 'Time Elapsed:', end - start  
   
foo()

這里只是寫了一個(gè)函數(shù),如果我想測(cè)量多個(gè)函數(shù)的延時(shí),由于必須知道start與end,所以必須寫在程序的開頭與結(jié)尾,難道每一個(gè)程序都這樣復(fù)制粘貼么?固然可行,但是,我們可以通過設(shè)計(jì)模式中將功能與數(shù)據(jù)部分分離一樣,將這個(gè)測(cè)量時(shí)間的函數(shù)分離出去,就像C++中我們可以將這個(gè)測(cè)量時(shí)間的函數(shù)變?yōu)橐粋€(gè)類,通過調(diào)用這個(gè)類,賦予不同的函數(shù)來測(cè)量不同的函數(shù)的運(yùn)行時(shí)長(zhǎng)。在python中,由于函數(shù)實(shí)際上就是對(duì)象,所以可以利用類似的方法實(shí)現(xiàn):

import time  
   
def foo():  
    print 'in foo()'  
   def timeit(func):  
    start = time.clock()  
    func()  
    end =time.clock()  
    print 'Time Elapsed:', end - start  
   
timeit(foo)

這里func()就可以指定函數(shù)了,但是如果我不想填這個(gè)函數(shù)或者這個(gè)功能函數(shù)并不能修改成類似的形式怎么辦?我們需要的是大限度的少改動(dòng):

import time     
def foo():      
    print 'in foo()'     
# 定義一個(gè)計(jì)時(shí)器,傳入一個(gè),并返回另一個(gè)附加了計(jì)時(shí)功能的方法  
def timeit(func):            
     # 定義一個(gè)內(nèi)嵌的包裝函數(shù),給傳入的函數(shù)加上計(jì)時(shí)功能的包裝      
     def wrapper():          
         start = time.clock()          
         func()          
         end =time.clock()          
         print 'Time Elapsed:', end - start             
 # 將包裝后的函數(shù)返回      
     return wrapper     
 foo = timeit
 (foo)   
 #可以直接寫成@timeit + foo定義,python的"語法糖"foo()
 #在這個(gè)代碼中,timeit(foo)不是直接產(chǎn)生調(diào)用效果,而是返回一個(gè)與foo參數(shù)列表一致的函數(shù),此時(shí)此foo非彼foo!因?yàn)榇藭r(shí)的foo具有了timeit的功效,簡(jiǎn)單來說就是能夠讓你在裝飾前后執(zhí)行代碼而無須改變函數(shù)本身內(nèi)容,裝飾器是一個(gè)函數(shù),而其參數(shù)為另外一個(gè)函數(shù)。
 #一個(gè)有趣的"漢堡"讓你了解順序
 #順序在修飾器還是非常重要的,利用一個(gè)代碼展示一下:
def bread(func) :      
    def wrapper() :          
        print ""          
        func()          
        print "<\______/>"      
    return wrapper     
def ingredients(func) :      
    def wrapper() :          
        print "#tomatoes#"          
        func()          
        print "~salad~"      
    return wrapper     
def sandwich(food="--ham--") :      
    print food     
    sandwich()  
#輸出 : --ham--  sandwich = bread(ingredients(sandwich)) 
 sandwich() 
  #輸出:  #  
   #tomatoes# 
   # --ham--
   # ~salad~ 
   #<\______/>

加上語法糖,代碼可以更簡(jiǎn)潔:

def bread(func) :  
    def wrapper() :  
        print ""  
        func()  
        print "<\______/>"  
    return wrapper  
   
def ingredients(func) :  
    def wrapper() :  
        print "#tomatoes#"  
        func()  
        print "~salad~"  
    return wrapper  
@bread  
@ingredients  
def sandwich(food="--ham--") :  
    print food  
   
sandwich()

看完了這篇文章,相信你對(duì)python的修飾器是什么有了一定的了解,想了解更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道,感謝各位的閱讀!


網(wǎng)站名稱:python的修飾器是什么-創(chuàng)新互聯(lián)
網(wǎng)站鏈接:http://weahome.cn/article/dogcps.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部