欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

python閉包與裝飾器

系統 1999 0

在一些語言中,在函數中可以(嵌套)定義另一個函數時,如果內部的函數引用了外部的函數的變量,則可能產生閉包。閉包可以用來在一個函數與一組“私有”變量之間創建關聯關系。在給定函數被多次調用的過程中,這些私有變量能夠保持其持久性。
——?維基百科

            
              def make_printer(msg):
    def printer():
        print msg  # 夾帶私貨(外部變量)
    return printer  # 返回的是函數,帶私貨的函數

printer = make_printer('Foo!')
printer()
            
          

閉包在Python中很常見,只不過你沒特別注意這就是一個閉包。比如Python中的裝飾器Decorator,假如你需要寫一個帶參數的裝飾器,那么一般都會生成閉包

            
              #不帶參數的裝飾器
def debug(func):
    def wrapper(*args, **kwargs):  # 指定宇宙無敵參數
        print "[DEBUG]: enter {}()".format(func.__name__)
        print 'Prepare and say...',
        return func(*args, **kwargs)
    return wrapper  # 返回

@debug
def say(something):
    print "hello {}!".format(something)
            
          

?

帶參數的裝飾器:

            
              def logging(level):
    def wrapper(func):
        def inner_wrapper(*args, **kwargs):
            print "[{level}]: enter function {func}()".format(
                level=level,
                func=func.__name__)
            return func(*args, **kwargs)
        return inner_wrapper
    return wrapper

@logging(level='INFO')
def say(something):
    print "say {}!".format(something)

# 如果沒有使用@語法,等同于
# say = logging(level='INFO')(say)

@logging(level='DEBUG')
def do(something):
    print "do {}...".format(something)

if __name__ == '__main__':
    say('hello')
    do("my work")
            
          

如果你的裝飾器如果帶參數,就需要在原來的裝飾器上再包一層,用于接收這些參數。這些參數(私貨)傳遞到內層的裝飾器里后,閉包就形成了。所以說當你的裝飾器需要自定義參數時,一般都會形成閉包。(類裝飾器例外)

類裝飾器

            
              class logging(object):
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        print "[DEBUG]: enter function {func}()".format(
            func=self.func.__name__)
        return self.func(*args, **kwargs)
@logging
def say(something):
    print "say {}!".format(something)
            
          

__call__ 這樣前后都帶下劃線的方法在Python中被稱為內置方法,有時候也被稱為魔法方法。

帶參數的類裝飾器:

            
              class logging(object):
    def __init__(self, level='INFO'):
        self.level = level
        
    def __call__(self, func): # 接受函數
        def wrapper(*args, **kwargs):
            print "[{level}]: enter function {func}()".format(
                level=self.level,
                func=func.__name__)
            func(*args, **kwargs)
        return wrapper  #返回函數

@logging(level='INFO')
def say(something):
    print "say {}!".format(something)
            
          

內置的裝飾器#

內置的裝飾器和普通的裝飾器原理是一樣的,只不過返回的不是函數,而是類對象,所以更難理解一些

@property

@staticmethod,@classmethod


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: av免费网站在线观看 | 精品久久一区二区三区 | 色黄网站在线观看 | 天堂在线中文字幕 | 精品国产理论在线观看不卡 | 国产精品日韩 | 91免费大全 | 精品一区二区三区在线视频 | 国产成人精品一区二区三区电影 | 色综合久久天天综合绕观看 | 日韩一级一欧美一级国产 | 久久er热在这里只有精品85 | 亚洲综合色婷婷久久 | 亚洲欧美日韩中文综合在线不卡 | 天天看高清特色大片 | 欧美a站 | 国产中文字幕在线 | 九九99国产精品视频 | 999久久久国产精品 成人不卡视频 | 波多野结衣三区 | 精品视频在线观看 | 欧美男人天堂 | 欧美激情一区二区三区视频高清 | 夜夜嘿视频免费看 | 亚洲福利视频一区二区 | 精品久久伊人 | 91在线播放视频 | 四虎永久免费网站入口2020 | 日韩欧美在 | 日韩有码在线观看 | 日本黄视频在线观看 | 日韩亚洲人成网站在线播放 | av中文字幕在线观看 | 广州一级毛片 | 奇米第四色在线 | 国产精品久久久久久中文字 | 99热久久这里只精品国产 | 亚洲最大福利视频 | 中文字幕精品一区久久久久 | 精品一区二区免费视频视频 | 成人禁在线观看网站 |