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
帶固定長參數的裝飾器

#!/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)結果: 輸入不合法
帶不定長參數的裝飾器

#!/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
多個裝飾器裝飾一個函數

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