כיצד להשתמש ב- Python Decorators כדי לשפר פונקציות

מעצבי Python הם דרך רבת עוצמה וגמישה לשנות או לשפר פונקציות ושיטות. מעצבים מספקים דרך לעטוף פונקציה עם פונקציונליות נוספת, ומאפשרים לך להרחיב את ההתנהגות שלה מבלי לשנות את הקוד שלה בפועל. מאמר זה יציג בפניכם את הרעיון של מעצבים, כיצד ליצור אותם ולהשתמש בהם, ולחקור כמה דוגמאות מעשיות.

מה זה דקורטור?

דקורטור הוא פונקציה שלוקחת פונקציה אחרת ומרחיבה את התנהגותה מבלי לשנות אותה במפורש. ב- Python משתמשים בעיצובים לעתים קרובות כדי להוסיף פונקציונליות כגון רישום, בקרת גישה או מדידת ביצועים לפונקציות או שיטות קיימות. עיצובים מוחלים על פונקציות באמצעות התחביר @decorator_name.

# Basic example of a decorator
def my_decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

say_hello()

איך עובדים מעצבים

כאשר אתה מחיל דקורטור על פונקציה, Python בעצם מבצע את השלבים הבאים:

  1. פונקציית הדקורטור נקראת עם הפונקציה המקורית כארגומנט שלה.
  2. פונקציית הדקורטור מגדירה פונקציה חדשה (נקראת לעתים קרובות עטיפה) שמשפרת או משנה את ההתנהגות של הפונקציה המקורית.
  3. פונקציית הדקורטור מחזירה את הפונקציה החדשה.
  4. כאשר הפונקציה המעוטרת נקראת, היא למעשה קוראת לפונקציה החדשה שהוחזרה על ידי המעצב.

יצירת דקורטור פשוט

בואו ניצור דקורטור פשוט שמודד את זמן הביצוע של פונקציה. זה שימושי עבור בדיקות ביצועים ואופטימיזציה.

import time

def timing_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"Execution time: {end_time - start_time} seconds")
        return result
    return wrapper

@timing_decorator
def slow_function():
    time.sleep(2)
    print("Function finished!")

slow_function()

שימוש בעיצובים עם ויכוחים

לפעמים, אולי תרצה להעביר ויכוחים למעצב שלך. כדי להשיג זאת, אתה צריך ליצור מפעל דקורטור - פונקציה שמחזירה מעצב. הנה דוגמה למעצב שדורש טיעון כדי לציין הודעה מותאמת אישית.

def custom_message_decorator(message):
    def decorator(func):
        def wrapper(*args, **kwargs):
            print(message)
            return func(*args, **kwargs)
        return wrapper
    return decorator

@custom_message_decorator("Starting the function...")
def greet(name):
    print(f"Hello, {name}!")

greet("Alice")

מקשטים לשיטות בכיתות

ניתן להשתמש במעצבים גם בשיטות בתוך השיעורים. שימושים נפוצים כוללים שיחות לשיטת רישום, בקרת גישה ותוצאות שמירה במטמון. הנה דוגמה לשימוש במעצב לרישום קריאות למתודה במחלקה.

def log_method_call(method):
    def wrapper(self, *args, **kwargs):
        print(f"Calling {method.__name__} with arguments {args} and keyword arguments {kwargs}")
        return method(self, *args, **kwargs)
    return wrapper

class MyClass:
    @log_method_call
    def my_method(self, x, y):
        print(f"Result: {x + y}")

obj = MyClass()
obj.my_method(5, 7)

מעצבי שרשראות

אתה יכול להחיל עיצובים מרובים על פונקציה אחת. הם מיושמים מהדקורטור הפנימי ביותר אל החיצוני ביותר. זה מאפשר לך לחבר פונקציות שונות יחד. הנה דוגמה לשרשרת שני מעצבים:

def uppercase_decorator(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        return result.upper()
    return wrapper

def exclamation_decorator(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        return result + "!"
    return wrapper

@exclamation_decorator
@uppercase_decorator
def greet(name):
    return f"Hello, {name}"

print(greet("Alice"))

מַסְקָנָה

דקורטורים הם כלי רב-תכליתי ב-Python המאפשר לך לשפר או לשנות את ההתנהגות של פונקציות ושיטות. על ידי שימוש בעיצובים, אתה יכול להוסיף פונקציונליות לשימוש חוזר על פני בסיס הקוד שלך מבלי לשנות את ההיגיון המרכזי של הפונקציות שלך. בין אם לצורך רישום, תזמון או שינוי פלט, מעצבים עוזרים לשמור על הקוד שלך נקי וניתן לתחזוקה. תרגל שימוש במעצבים כדי להיות מיומנים יותר ולמנף את הכוח שלהם בפרויקטים של Python שלך.