python 裝飾器功能以及函數參數使用介紹

來源:互聯網
上載者:User

簡單的說:裝飾器主要作用就是對函數進行一些修飾,它的出現是在引入類方法和靜態方法的時候為了定義靜態方法出現的。例如為了把foo()函式宣告成一個靜態函數 複製代碼 代碼如下:class Myclass(object):
def staticfoo():
............
............
staticfoo = staticmethod(staticfoo)

可以用裝飾器的方法實現: 複製代碼 代碼如下:class Myclass(object):
  @staticmethod  
  def staticfoo():
    .........
    .........

這個例子很明顯很容易就可以看懂。

說到這裡我們舉一個下面的例子,這個例子裡面同時涉及到一個重要內容,就是對於python中的函數的本質理解。

代碼: 複製代碼 代碼如下:# -*- coding: utf-8 -*-
from time import ctime
from time import sleep
def ftfunc(func):
def timef():
print "[%s] %s() called" % (ctime(),func.__name__)
return func()
return timef

@ftfunc
def foo():
print 'hello'

if __name__ == '__main__':

foo()
sleep(2)

for i in range(2):
sleep(1)
foo()

運行這段代碼;我們可以看到終端依次會輸出以下內容:


其中ftfunc函數是我們自己自訂的一個函數,這個函數是以一個函數作為參數的函數,這也就滿足了作為一個裝飾器的要求,根據上面我們對於裝飾器的等價變換規則,這段代碼

複製代碼 代碼如下:@ftfunc
def foo():
print 'hello'

可以轉換成以下的代碼: 複製代碼 代碼如下:def foo():
print 'hello'

foo = ftfunc(foo)

再結合上面原來的代碼我們很快就可以體會到了裝飾器的作用。

但是我在編寫這段代碼的時候,有一個地方打錯了:

這段代碼: 複製代碼 代碼如下:return func()
return timef

被我寫成了: 複製代碼 代碼如下:return func
return timef

於是輸出結果就是不一樣,後來終於發現了一個重要的概念:"foo"是函數對象的引用,而"foo()"是函數對象的調用。關於對象引用是python的重要的基礎概念,在python中一切都是對象,同時類型是屬於對象,而不是變數。一切的變數只是對象的引用,相當於讓這個變數指向這個對象。“foo”正好可以理解成一個變數,只不過是它指向一個函數的對象。而“foo()”是函數對象的調用,即調用這個對象,是要執行這個函數的功能的。這裡需要慢慢理解品味。基於此:

這樣的一段代碼運行結果和剛才是一模一樣的。注意比較與剛才那段代碼的不同之處,更加有利於理解。 複製代碼 代碼如下:# -*- coding: utf-8 -*-
from time import ctime
from time import sleep
def ftfunc(func):
def timef():
print "[%s] %s() called" % (ctime(),func.__name__)
return func
return timef

@ftfunc
def foo():
print 'hello'

if __name__ == '__main__':

foo()()
sleep(2)

for i in range(2):
sleep(1)
foo()()

此代碼運行結果:

其實還可以分別對返回的timef函數加上括弧,看看結果會是怎麼樣的。可以更好理解python中函數的概念。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.