उन्नत प्रोग्रामर्स के लिए पायथन डेकोरेटर्स की एक गाइड

पायथन डेकोरेटर फ़ंक्शन या विधियों के व्यवहार को संशोधित करने के लिए एक शक्तिशाली और लचीला उपकरण है। वे प्रोग्रामर को कॉल करने योग्य ऑब्जेक्ट की कार्यक्षमता को स्वच्छ, पठनीय और रखरखाव योग्य तरीके से विस्तारित या बदलने की अनुमति देते हैं। यह लेख पायथन डेकोरेटर से संबंधित उन्नत अवधारणाओं का पता लगाता है, जिसमें नेस्टेड डेकोरेटर, डेकोरेटर तर्क और क्लास-आधारित डेकोरेटर शामिल हैं।

डेकोरेटर्स क्या हैं?

डेकोरेटर ऐसे फ़ंक्शन होते हैं जो किसी दूसरे फ़ंक्शन के व्यवहार को संशोधित करते हैं। वे किसी दूसरे फ़ंक्शन को उसके कोड को स्पष्ट रूप से संशोधित किए बिना उसके व्यवहार को विस्तारित करने के लिए लपेटते हैं। डेकोरेटर को @decorator_name सिंटैक्स का उपयोग करके परिभाषित किया जाता है और उन्हें फ़ंक्शन परिभाषा के ऊपर रखा जाता है।

बेसिक डेकोरेटर सिंटैक्स

एक साधारण डेकोरेटर एक फ़ंक्शन को एक तर्क के रूप में लेता है, एक आंतरिक फ़ंक्शन को परिभाषित करता है जो कुछ व्यवहार जोड़ता है, और फिर आंतरिक फ़ंक्शन को वापस करता है।

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()

तर्कों के साथ डेकोरेटर फ़ंक्शन

तर्कों को स्वीकार करके डेकोरेटर अधिक लचीले हो सकते हैं। ऐसा डेकोरेटर बनाने के लिए, आपको एक ऐसा फ़ंक्शन लिखना होगा जो डेकोरेटर लौटाता हो। यह डेकोरेटर में अधिक गतिशील व्यवहार जोड़ने में सक्षम बनाता है।

def repeat(num_times):
    def decorator_repeat(func):
        def wrapper(*args, **kwargs):
            for _ in range(num_times):
                func(*args, **kwargs)
        return wrapper
    return decorator_repeat

@repeat(num_times=3)
def greet(name):
    print(f"Hello, {name}!")

greet("Alice")

नेस्टिंग डेकोरेटर्स

डेकोरेटर को कई व्यवहारों को संयोजित करने के लिए नेस्ट किया जा सकता है। उदाहरण के लिए, हम एक ही फ़ंक्शन पर दो या अधिक डेकोरेटर का उपयोग कर सकते हैं।

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

def repeat_decorator(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        return result + result
    return wrapper

@repeat_decorator
@uppercase_decorator
def say_word(word):
    return word

print(say_word("hello"))

वर्ग-आधारित सज्जाकार

पायथन में, डेकोरेटर को __call__ विधि का उपयोग करके कक्षाओं के रूप में भी लागू किया जा सकता है। क्लास-आधारित डेकोरेटर तब उपयोगी होते हैं जब आपको अधिक जटिल स्टेट मैनेजमेंट और व्यवहार की आवश्यकता होती है।

class CountCalls:
    def __init__(self, func):
        self.func = func
        self.num_calls = 0

    def __call__(self, *args, **kwargs):
        self.num_calls += 1
        print(f"Call {self.num_calls} of {self.func.__name__!r}")
        return self.func(*args, **kwargs)

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

say_hello()
say_hello()

मेटाडेटा को संरक्षित करने के लिए functools.wraps का उपयोग करना

जब आप डेकोरेटर लिखते हैं, तो डेकोरेटेड फ़ंक्शन अपना मूल मेटाडेटा खो देता है, जैसे उसका नाम और डॉकस्ट्रिंग। functools.wraps डेकोरेटर का उपयोग मूल फ़ंक्शन के मेटाडेटा को रैपर फ़ंक्शन में कॉपी करने के लिए किया जा सकता है।

from functools import wraps

def my_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        print("Wrapper function executed before", func.__name__)
        return func(*args, **kwargs)
    return wrapper

@my_decorator
def display_info(name, age):
    """Displays name and age."""
    print(f"display_info ran with arguments ({name}, {age})")

print(display_info.__name__)  # Output: display_info
print(display_info.__doc__)   # Output: Displays name and age.

निष्कर्ष

पायथन डेकोरेटर एक शक्तिशाली विशेषता है जो लचीले कोड डिज़ाइन और व्यवहार संशोधन की अनुमति देता है। नेस्टेड डेकोरेटर, तर्कों के साथ डेकोरेटर और क्लास-आधारित डेकोरेटर जैसे उन्नत उपयोग, पायथन प्रोग्रामों को और भी अधिक कार्यक्षमता और पठनीयता प्रदान कर सकते हैं। डेकोरेटर को सही ढंग से समझने और उपयोग करने से, डेवलपर्स अधिक संक्षिप्त, कुशल और पठनीय कोड लिख सकते हैं।

लिंक
Python