欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python中的裝飾器詳解

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

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

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

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

復制代碼 代碼如下:

@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

帶內嵌函數(shù)裝飾器

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

復制代碼 代碼如下:

def  deco(func):
    def _deco(x):    #該函數(shù)為內嵌函數(shù)
        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

帶參數(shù)的裝飾器

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

總結

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

復制代碼 代碼如下:

#!/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使用cv2庫、下載opencv庫的方法

    python使用cv2庫、下載opencv庫的方法

    這篇文章主要介紹了python使用cv2庫、下載opencv庫的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • 利用Python將數(shù)值型特征進行離散化操作的方法

    利用Python將數(shù)值型特征進行離散化操作的方法

    今天小編就為大家分享一篇利用Python將數(shù)值型特征進行離散化操作的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • python剪切視頻與合并視頻的實現(xiàn)

    python剪切視頻與合并視頻的實現(xiàn)

    這篇文章主要介紹了python剪切視頻與合并視頻的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • 利用Python將多張圖片合成視頻的實現(xiàn)

    利用Python將多張圖片合成視頻的實現(xiàn)

    這篇文章主要介紹了利用Python將多張圖片合成視頻的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • 更新修改后的Python模塊方法

    更新修改后的Python模塊方法

    在本篇內容中我們給大家整理了關于如何更新修改后的Python模塊的具體步驟和方法,有興趣的朋友們學習下。
    2019-03-03
  • 基于SQLAlchemy實現(xiàn)操作MySQL并執(zhí)行原生sql語句

    基于SQLAlchemy實現(xiàn)操作MySQL并執(zhí)行原生sql語句

    這篇文章主要介紹了基于SQLAlchemy實現(xiàn)操作MySQL并執(zhí)行原生sql語句,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • 在pytorch 中計算精度、回歸率、F1 score等指標的實例

    在pytorch 中計算精度、回歸率、F1 score等指標的實例

    今天小編就為大家分享一篇在pytorch 中計算精度、回歸率、F1 score等指標的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • Pytorch to(device)用法

    Pytorch to(device)用法

    今天小編就為大家分享一篇Pytorch to(device)用法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • selenium python瀏覽器多窗口處理代碼示例

    selenium python瀏覽器多窗口處理代碼示例

    這篇文章主要介紹了selenium python瀏覽器多窗口處理代碼示例,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • 詳解Python中數(shù)據處理的方法總結及實現(xiàn)

    詳解Python中數(shù)據處理的方法總結及實現(xiàn)

    數(shù)據增強作為前處理的關鍵步驟,在整個計算機視覺中有著具足輕重的地位。本文為大家總結了Python中數(shù)據處理的方法及實現(xiàn),需要的可以參考一下
    2022-09-09

最新評論