पायथन डेवलपर्स डेकोरेटर्स का उपयोग करके कॉल करने योग्य स्वयं को स्थायी रूप से संशोधित किए बिना कॉल करने योग्य कार्यों, विधियों या कक्षाओं के व्यवहार को बढ़ा और संशोधित कर सकते हैं। संक्षेप में हम कह सकते हैं कि वे कॉल करने योग्य वस्तुएं हैं जिनका उपयोग कार्यों या कक्षाओं को संशोधित करने के लिए किया जाता है।
फंक्शन डेकोरेटर ऐसे फंक्शन होते हैं जो फंक्शन रेफरेंस को तर्कों के रूप में स्वीकार करते हैं और उनके चारों ओर एक रैपर जोड़ते हैं और रैपर के साथ फंक्शन को एक नए फंक्शन के रूप में लौटाते हैं।
आइए एक उदाहरण से फंक्शन डेकोरेटर को समझते हैं:
कोड1
@decoratordef func(arg):रिटर्न "वैल्यू"
उपरोक्त कोड समान है:
कोड2
def func(arg):रिटर्न "वैल्यू" func =डेकोरेटर (func)
तो ऊपर से, हम देख सकते हैं कि एक डेकोरेटर बस एक और फ़ंक्शन है जो एक फ़ंक्शन को एक तर्क के रूप में लेता है और एक देता है।
डेकोरेटर मूल रूप से किसी अन्य फ़ंक्शन को "सजावट" या "रैप" करते हैं और आपको नीचे दिए गए उदाहरण में बताए अनुसार लिपटे फ़ंक्शन के चलने से पहले और बाद में कोड निष्पादित करने देते हैं:
def our_decorator(func):def function_wrapper(x):प्रिंट ("कॉल करने से पहले" + func.__name__) func(x) प्रिंट ("कॉल करने के बाद" + func.__name__) रिटर्न function_wrapperdef foo(x):प्रिंट ( "हाय, फू को "+ str(x)) प्रिंट ("हम सजावट से पहले फू कहते हैं:") फू ("हाय") प्रिंट ("अब हम फू को एफ के साथ सजाते हैं:") फू =हमारे_डेकोरेटर (फू) के साथ बुलाया गया है। प्रिंट ("हम सजावट के बाद फू कहते हैं:") फू (90)
आउटपुट
हम डेकोरेशन से पहले foo को कॉल करते हैं:Hi, foo को Hi के साथ कॉल किया गया है, अब हम foo को f से सजाते हैं:हम डेकोरेशन के बाद foo को कॉल करते हैं:fooHi को कॉल करने से पहले, foo को 90 के साथ कॉल किया जाता है। foo को कॉल करने के बाद
यदि आपको लगता है कि ऊपर थोड़ा जटिल है, तो सबसे सरल संभव डेकोरेटर लिखें:
def null_decorator(func):रिटर्न func
ऊपर null_decorator एक कॉल करने योग्य (फ़ंक्शन) है, यह अपने इनपुट के रूप में एक और कॉल करने योग्य लेता है और यह उसी इनपुट को कॉल करने योग्य बिना इसे संशोधित किए देता है।
आइए किसी अन्य फ़ंक्शन को सजाकर (या लपेटकर) हमारे उपरोक्त सरलतम डेकोरेटर का विस्तार करें।
def null_decorator(func):रिटर्न funcdef ग्रीटिंग ():रिटर्न "हैलो, पायथन!" ग्रीट =नल_डेकोरेटर (ग्रीट)>>> ग्रीट ()'हैलो, पायथन!'ऊपर हमने एक ग्रीट फंक्शन को परिभाषित किया है और फिर इसे नल_डेकोरेटर फंक्शन के माध्यम से चलाकर तुरंत सजाया है।
अजगर सजावटी कार्यक्रम के ऊपर लिखने का बहुत आसान तरीका है (बजाय स्पष्ट रूप से null_decorator को अभिवादन पर कॉल करना और फिर अभिवादन चर को पुन:असाइन करना) एक चरण में फ़ंक्शन को सजाने के लिए अजगर @syntax का उपयोग करना है:
@null_decoratordef ग्रीटिंग ():रिटर्न "हैलो, पायथन!">>> ग्रीट ()'हैलो, पायथन!'