最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python中的裝飾器詳解

 更新時間:2015年04月13日 08:59:02   投稿:junjie  
這篇文章主要介紹了python中的裝飾器詳解,本文講解了裝飾器語法、簡單裝飾器、帶內嵌函數裝飾器、帶參數的裝飾器等內容,需要的朋友可以參考下

在了解裝飾器的之前一定要先了解函數作為參數傳遞, 什么是函數內嵌,請參考我之前寫的博客函數簡介

因為在python里面,函數也是對象,也可以作為參數進行傳遞.python裝飾器本質也是一種特殊函數,它接收的參數是函數對象,然后動態(tài)地函數參數添加額外的功能,而不用修改原有的函數對象.python裝飾器傳入的參數是函數,返回的值也是函數!
python裝飾器思想有點類似設計模式的裝飾模式, 其意圖是動態(tài)地給函數對象添加額外的功能.比如像增加日志打印的功能,有點面向切面編程(AOP)的感覺.
裝飾器語法

以@開頭,接著后面跟著的是裝飾器的名字和可選的參數.裝飾器語法是一種語法糖.
格式如下

復制代碼 代碼如下:

@decomaker(deco_args)
    def foo(func_opt_args)

可以組合,等價于foo = g(f(foo))
復制代碼 代碼如下:

@g
@f
def foo():
    statement

簡單裝飾器

實例

復制代碼 代碼如下:

#!/usr/bin/python
def  deco(func):
    print 'start'
    func()
    print 'end'
    return func

@deco
def foo():
    print 'In foo'

foo()
foo()


輸出
復制代碼 代碼如下:

start
In foo
end
In foo
In foo

帶內嵌函數裝飾器

內嵌函數保證每次新函數都被調用.而且被裝飾的函數可以帶有參數.
實例

復制代碼 代碼如下:

def  deco(func):
    def _deco(x):    #該函數為內嵌函數
        print 'start'
        func(x)
        print 'end'
    return _deco

@deco
def foo(x):
    print 'In foo, get value is: %d' % x

foo(123456)


輸出:
復制代碼 代碼如下:

start
In foo, get value is: 123456
end

帶參數的裝飾器

需要自己返回以函數作為參數的裝飾器。換句話說,decomaker()用 deco_args 做了些事并返回函數對象,而該函數對象正是以 foo 作為其參數的裝飾器。簡單的說來:foo=decomaker(deco_args)(foo)

實例

復制代碼 代碼如下:

def deco(arg):
    def wrapper1(func):
        def _deco(x):
            print "get type is: ", arg
            func(x)
        return _deco

    def wrapper2(func):
        def _deco(x):
            func(x)
            print "get type is: ", arg
        return _deco

    if arg == 'type1':
        return wrapper1
    else:
        return wrapper2

@deco("type2")
def foo(x):
    print 'In foo: ', x

foo(123)


輸出
復制代碼 代碼如下:

In foo:  123
get type is:  type2

總結

裝飾器本質是高階的函數,可以裝飾其他函數,增加被裝飾函數的功能,但不能覆蓋或改變被裝飾函數原有的行為.對于被裝飾的函數來說,裝飾器是透明的.裝飾器傳入參數為函數,返回的函數是被裝飾的函數.最后我們來實現給一個函數添加打印日志的功能,而不用改變這個函數.

復制代碼 代碼如下:

#!/usr/bin/python
#coding=utf-8
import functools

def log(prefix, suffix):
    def deco(func):
        @functools.wraps(func)
        def wrapper(*args, **kargs):
            print '%s log start' % prefix
            print('get a is: %s' % args[0])
            print('get b is: %s' % args[1])
            print('get c is: %s' % args[2])
            print('get d is: %s' % kargs['d'])
            print('get d is: %s' % kargs['f'])
            func(*args, **kargs)
            print '%s log end' % suffix
        return wrapper
    return deco

@log('logstart', 'logend')
def test(a, b, c, d, f):
    print 'call func name is: %s' % test.__name__

test(1, 2, 3, d = 'dddd', f = 'ffff')


輸出:
復制代碼 代碼如下:

logstart log start
get a is: 1
get b is: 2
get c is: 3
get d is: dddd
get d is: ffff
call func name is: test
logend log end

相關文章

  • Python函數用法和底層原理分析

    Python函數用法和底層原理分析

    函數是可重用的程序代碼塊。函數的作用,不僅可以實現代碼的復用,更能實現代碼的一致性。一致性指的是,只要修改函數的代碼,則所有調用該函數的地方都能得到體現,這篇文章主要介紹了Python函數用法和底層分析,需要的朋友可以參考下
    2022-12-12
  • django ManyToManyField多對多關系的實例詳解

    django ManyToManyField多對多關系的實例詳解

    今天小編就為大家分享一篇django ManyToManyField多對多關系的實例詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • python中刪除某個元素的方法解析

    python中刪除某個元素的方法解析

    這篇文章主要介紹了python中刪除某個元素的方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • python實現的防DDoS腳本

    python實現的防DDoS腳本

    實現原理是,查詢netstat的連接數,同IP超過一定連接的用iptables封禁一定時間,自動封禁,自動解封。
    2011-02-02
  • scrapy實踐之翻頁爬取的實現

    scrapy實踐之翻頁爬取的實現

    這篇文章主要介紹了scrapy實踐之翻頁爬取的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • 利用Python定位Span標簽中文字的實戰(zhàn)指南

    利用Python定位Span標簽中文字的實戰(zhàn)指南

    在網頁數據抓取和信息提取的過程中,經常需要定位并獲取HTML中特定標簽的內容,其中,<span>標簽是一個常見的內聯元素,用于對文本進行分組或應用樣式,本文將詳細介紹如何使用Python來定位并提取<span>標簽中的文字,需要的朋友可以參考下
    2024-12-12
  • Django REST framework 如何實現內置訪問頻率控制

    Django REST framework 如何實現內置訪問頻率控制

    這篇文章主要介紹了Django REST framework 內置訪問頻率控制,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • Tensorflow 使用pb文件保存(恢復)模型計算圖和參數實例詳解

    Tensorflow 使用pb文件保存(恢復)模型計算圖和參數實例詳解

    今天小編就為大家分享一篇Tensorflow 使用pb文件保存(恢復)模型計算圖和參數實例詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • pybind11在Windows下的使用教程

    pybind11在Windows下的使用教程

    Pybind11算是目前最方便的Python調用C++的工具了, 介紹一下在vs2019上寫Python的擴展的HelloWorld,感興趣的朋友跟隨小編一起看看吧
    2019-07-07
  • Python之np.where()如何替換缺失值

    Python之np.where()如何替換缺失值

    這篇文章主要介紹了Python中的np.where()如何替換缺失值問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02

最新評論

昆明市| 天津市| 高邑县| 蓬莱市| 买车| 辽阳县| 读书| 华容县| 铁岭县| 石棉县| 永康市| 岳阳县| 京山县| 金寨县| 青铜峡市| 江源县| 桂林市| 通辽市| 武川县| 新闻| 乐山市| 大港区| 唐河县| 贵港市| 中山市| 堆龙德庆县| 青冈县| 五大连池市| 连江县| 宝应县| 襄垣县| 绿春县| 益阳市| 栾城县| 阜南县| 吉木乃县| 灯塔市| 天门市| 邮箱| 江陵县| 和龙市|