@ python的修飾符

來源:互聯網
上載者:User
@符號在python語言中具有特殊含義,用來作為修飾符使用。
具體可以參考下面的代碼:

#! /usr/bin/env python
#coding=utf-8

from time import ctime, sleep

def tcfunc(func):
    def wrappedFunc():
        print '[%s] %s() called' %(
            ctime(), func)
        return func()
    print "in tcfunc called"
    print "wrapped func %s" %wrappedFunc
    return wrappedFunc

# decorator 僅調用tcfunc函數,該函數將foo作為一個參數,返回一個
# wrappedFunc函數對象,用該對象來取代foo函數在外部的調用,foo
# 定義的函數只能夠在內部進行調用,外部無法擷取其調用方式!!
@tcfunc         # call sequence is : tcfunc(func) --> wrappedFunc -- > func
def foo():
    print "in foo called"
    pass

print "foo func : %s" %foo

foo()  
print "-"*100
sleep(4)

for i in range(2):
    sleep(i)
    foo()
    print "-"*100

上面函數中,tcfunc定義了一個函數,裡面內嵌一個函數,該函數需要一個func的參數。

@tcfunc則表示下面定義的函數將函數名作為tcfunc的參數被tcfunc調用。
代碼:@tcfunc
def foo():
    pass

在定義的時候,就被tcfunc調用,即tcfunc(foo),該函數返回一個wrappedFunc對象,而該定義foo函數名對象其實已經被wrappedFunc對象給取代, foo()定義的函數只在tcfunc函數內部作為參數被使用!我們可以通過列印它們的地址來查看tcfunc外部調用的foo與wrappedFunc是否為同一個對象:

in tcfunc called
wrapped func <function wrappedFunc at 0x01A3DD30>
foo func : <function wrappedFunc at 0x01A3DD30>
[Thu Jan 08 00:04:35 2009] <function foo at 0x01A3DCF0>() called
in foo called
----------------------------------------------------------------------------------------------------
[Thu Jan 08 00:04:39 2009] <function foo at 0x01A3DCF0>() called
in foo called
----------------------------------------------------------------------------------------------------
[Thu Jan 08 00:04:40 2009] <function foo at 0x01A3DCF0>() called
in foo called
----------------------------------------------------------------------------------------------------

從中可以看到,在tcfunc外部的函數對象與wrappedFunc的函數對象是同一個對象,在tcfunc內部參數func中調用的
才是實際定義的foo函數對象!!!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.