นักพัฒนา Python สามารถขยายและแก้ไขพฤติกรรมของฟังก์ชันที่เรียกใช้ได้ เมธอด หรือคลาส โดยไม่ต้องแก้ไขตัวเรียกใช้เองอย่างถาวรโดยใช้มัณฑนากร กล่าวโดยย่อ เราสามารถพูดได้ว่ามันเป็นวัตถุที่เรียกได้ซึ่งใช้ในการแก้ไขฟังก์ชันหรือคลาส
ตัวตกแต่งฟังก์ชันคือฟังก์ชันที่ยอมรับการอ้างอิงฟังก์ชันเป็นอาร์กิวเมนต์ และเพิ่ม wrapper รอบๆ ฟังก์ชันและส่งกลับฟังก์ชันด้วย wrapper เป็นฟังก์ชันใหม่
มาทำความเข้าใจฟังก์ชันมัณฑนากรกันเถอะ ลาก่อน ตัวอย่าง:
รหัส1
@decorator def func(arg): return "value"
โค้ดด้านบนเหมือนกับ:
โค้ด2
def func(arg): return "value" func = decorator(func)
จากด้านบน เราจะเห็นว่ามัณฑนากรเป็นเพียงฟังก์ชันอื่นที่ใช้ฟังก์ชันเป็นอาร์กิวเมนต์และส่งกลับฟังก์ชันหนึ่ง
มัณฑนากรโดยพื้นฐานแล้วจะ "ตกแต่ง" หรือ "ห่อ" ฟังก์ชันอื่น และให้คุณรันโค้ดก่อนและหลังการทำงานของฟังก์ชันที่ห่อนั้นทำงานตามที่อธิบายไว้ในตัวอย่างด้านล่าง:
def our_decorator(func): def function_wrapper(x): print("Before calling " + func.__name__) func(x) print("After calling " + func.__name__) return function_wrapper def foo(x): print("Hi, foo has been called with " + str(x)) print("We call foo before decoration:") foo("Hi") print("We now decorate foo with f:") foo = our_decorator(foo) print("We call foo after decoration:") foo(90)
ผลลัพธ์
We call foo before decoration: Hi, foo has been called with Hi We now decorate foo with f: We call foo after decoration: Before calling foo Hi, foo has been called with 90 After calling foo
หากคุณคิดว่าข้างต้นซับซ้อนเล็กน้อย ให้เขียนตัวตกแต่งที่ง่ายที่สุด:
def null_decorator(func): return func
เหนือ null_decorator เป็นฟังก์ชันที่เรียกได้ (ฟังก์ชัน) โดยจะใช้การเรียกอีกอย่างหนึ่งเป็นอินพุต และคืนค่าอินพุตเดิมที่เรียกได้โดยไม่ต้องแก้ไข
มาขยายมัณฑนากรที่ง่ายที่สุดโดยการตกแต่ง (หรือห่อ) ฟังก์ชั่นอื่นกันเถอะ
def null_decorator(func): return func def greet(): return "Hello, Python!" greet = null_decorator(greet) >>> greet() 'Hello, Python!'
ด้านบน เราได้กำหนดฟังก์ชันทักทายแล้วตกแต่งทันทีโดยเรียกใช้ผ่านฟังก์ชัน null_decorator
วิธีที่ง่ายกว่ามากในการเขียนเหนือโปรแกรมตกแต่งหลาม (แทนที่จะเรียก null_decorator อย่างชัดเจนแล้วกำหนดตัวแปรทักทายใหม่) คือการใช้ python @syntax เพื่อตกแต่งฟังก์ชันในขั้นตอนเดียว:
@null_decorator def greet(): return "Hello, Python!" >>> greet() 'Hello, Python!'