Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

มัณฑนากรฟังก์ชั่นใน Python?


นักพัฒนา 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!'