पायथन डेवलपर्स डेकोरेटर्स का उपयोग करके किसी कॉल करने योग्य फंक्शन, मेथड या क्लास के व्यवहार को बिना स्थायी रूप से संशोधित किए बढ़ा या बदल सकते हैं। संक्षेप में कहें तो वे कॉल करने योग्य ऑब्जेक्ट्स होते हैं जिनका उपयोग फंक्शंस या क्लासेस को संशोधित करने के लिए किया जाता है।
फंक्शन डेकोरेटर्स कैसे काम करते हैं?
फंक्शन डेकोरेटर्स ऐसे फंक्शंस होते हैं जो फंक्शन रेफरेंस को आर्गुमेंट के रूप में स्वीकार करते हैं, उनके चारों ओर एक व्रैपर जोड़ते हैं और व्रैपर के साथ फंक्शन को एक नए फंक्शन के रूप में लौटाते हैं।
आइए एक उदाहरण से फंक्शन डेकोरेटर को समझते हैं:
कोड 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!'
उपरोक्त हमने एक greet फंक्शन परिभाषित किया और फिर तुरंत इसे null_decorator फंक्शन के माध्यम से चलाकर डेकोरेट किया।
उपरोक्त पायथन डेकोरेटिव प्रोग्राम को लिखने का बहुत सरल तरीका (बजाय स्पष्ट रूप से greet पर null_decorator को कॉल करने और फिर greet वेरिएबल को पुनः असाइन करने के) पायथन के @ सिंटैक्स का उपयोग करके एक चरण में फंक्शन को डेकोरेट करना है:
@null_decorator
def greet():
return "Hello, Python!"
>>> greet()
'Hello, Python!'