天天看點

python 裝飾器

Python 裝飾器 

裝飾器的作用:裝飾器的作用就是為已經存在的對象,在不影響對象本身代碼的同時,對其添加額外的功能。

裝飾器原理:将原函數封裝到一個新函數内,在新函數中會在原函數執行前後執行某些代碼,并且傳回原函數的傳回值。

不帶參數的裝飾器

python 裝飾器
python 裝飾器
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/11/13 0013 13:53
# @Author  : ming
def func1(f):  # 将原函數的函數名作為參數傳遞,對于本例傳遞的函數名就是f1
    def func2():  # 定義一個新的函數,其内部包含我們附加的代碼,并且調用原函數。
        print "我是在函數執行之前附加的功能"  # 這是我們在原函數執行之前增加的額外功能
        r = f()  # 此處調用原函數,這裡的f()函數,就是我們傳遞進來的f1()函數
        print "我是在函數執行之後附加的功能"  # 這是我們在原函數執行之後增加的額外功能
        return r  # 傳回原函數的傳回值給func1

    return func2  # 傳回原函數的傳回值 r 給調用者


@func1  # 調用裝飾器
def f1():  # 原函數
    print "我是原函數實作的功能"
    return "我是原函數的傳回值"


print f1()

#運作結果
我是在函數執行之前附加的功能
我是原函數實作的功能
我是在函數執行之後附加的功能
我是原函數的傳回值      

View Code

帶固定長參數的裝飾器

python 裝飾器
python 裝飾器
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/11/13 0013 13:53
# @Author  : ming
def func1(f):  # 将原函數的函數名作為參數傳遞,對于本例傳遞的函數名就是f1
    def func2(x, y):  # 定義一個新函數,新函數需要定義和被裝飾函數相同數量的形參數量
        if x % 2 == 0 and y % 2 == 1:  # 在原函數之前執行的功能
            r = f(x, y)  # 執行原函數
            print "good"  # 在原函數之後執行的功能
            return r  # 傳回原函數的傳回值
        else:
            return "輸入不合法"

    return func2  # 将新函數作為傳回值傳回

@func1  # 調用裝飾器
def f1(x, y):  # 原函數
    return x * y


print ("f1(110, 3)結果: %s \n" % f1(110, 3)) #調用函數

print ("f1(111, 3)結果: %s \n" % f1(111, 3)) #調用函數

# 運作結果
good
f1(110, 3)結果: 330 

f1(111, 3)結果: 輸入不合法       

 帶不定長參數的裝飾器

python 裝飾器
python 裝飾器
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/11/13 0013 13:53
# @Author  : ming
def func1(f):  # 将原函數的作為參數傳遞
    def func2(*args, **kwargs):  # 新函數
        print "hello"  # 在原函數之前執行
        r = f(*args, **kwargs)  # 原函數
        print "end"  # 在原函數之後執行
        return r  # 傳回原函數的傳回值

    return func2  # 将新函數作為傳回值傳回


@func1  # 裝飾器
def f1(x, y, c):  # 原函數
    print x + y + c


f1(1, 2, 4)


@func1  # 裝飾器
def f2(x, y):  # 原函數
    print x + y


f2(1, 2, )

#運作結果
hello
7
end
hello
3
end      

 多個裝飾器裝飾一個函數

python 裝飾器
python 裝飾器
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/11/13 0013 13:53
# @Author  : ming
def func1(f):
    def func2(*args, **kwargs):
        print "hello"
        r = f(*args, **kwargs)
        print "end"
        return r

    return func2


def func2(f):
    def func2(*args, **kwargs):
        print "HELLO"
        r = f(*args, **kwargs)
        print "END"
        return r

    return func2


@func2  # 先執行func2裝飾器
@func1  # 在執行func2裝飾器
def f1(x, y, c):
    print x + y + c
    return "我是原函數傳回值"


print f1(1, 2, 4)

#運作結果
HELLO
hello
7
end
END
我是原函數傳回值      

未完待續。。。。

作者:楊永明

出處:https://www.cnblogs.com/ming5218/

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接。