Decorator เป็นการเขียน function ครอบ function เพื่อให้สามารถ แยก logic บางอย่าง เช่น validate, connection ต่าง ๆ ออกจาก business ได้
รูปแบบ ก็จะเป็นแบบนี้
function( function( function (data) ) )
function( function( function (data), condition ), condition )
และก็ไม่จำเป็นเสมอไปที่ function ข้างนอกสุดจะทำก่อน มันขึ้นอยู่ตอน เราเขียน decorator
ว่าจะให้ทำอะไรก่อนครับ ตามตัวอย่างได้ อธิบายไว้ ด้านล่าง.
---------------------------------
##Example Decorator class :
## สร้างเพื่อไว้ validate field ที่ต้องการ check ว่าต้องมีส่งมา
## ถ้าไม่มีจะ raise (แจ้ง error) กลับไป ยัง function ที่ทำการเรียก
## และเมื่อ check ว่ามีครบ ก็จะทำการเรียก function ต่อไป
class ReqParam:
def __init__(self, *args):
self.fields = args
def __call__(self, f):
fileds = self.fields
def wrapper_func(*arg, **kws):
dict = kws
for filed in fields:
if not kw.has_key(filed) or '' == kw.get(filed):
raise Exception('parameter '+filed+' not set.')
dict = f(*arg, **kws)
return dict
return wrapper_func
## จุดสำคัญคือ การว่าในส่วนของ dict = f(*arg, **kws) จะเป็นจุดกำหนดว่าจะทำ function ก่อน
## หรือ Decorator นั้นจะจัดการอะไรบางอย่างก่อนครับ
---------------------------------
##Example function use Decorator :
## ตัวอย่างการเรียกใช้ ในที่นี้เราจะเห็นได้ว่า สามารถมี Decorator ได้มากกว่า 1
@ReqParam('refno', 'frommsn', 'tomsn', 'msg', 'msgseq')
def postwap(self, **kw):
refno = kw.get('refno')
frommsn = kw.get('frommsn')
tomsn = kw.get('tomsn')
msg = kw.get('msg')
msgindex = kw.get('msgseq')
print 'refno:', refno, 'from msn:', frommsn, ', to msn:', tomsn, ', message:', msg, ', msgseq:', msgseq
kw.setdefault('status', 0)
return kw
## สำหรับการเรียกใช้ function ก็เป็นการเรียก ตามปกติครับ
ไปต่อกันดีกว่าครับที่ decorator ซ้อนหลายชั้น
python multi decorator
---------------------------------
ในส่วนของการ เขียน Decorator นั้น สามารถทำได้ทั้ง แบบ def หรือ class ก็ได้ครับ
ตัวอย่าง :
http://www.python.org/dev/peps/pep-0318/
http://www.artima.com/weblogs/viewpost.jsp?thread=240808
End...