পাইথন ডেভেলপাররা ডেকোরেটর ব্যবহার করে কলেবলকে স্থায়ীভাবে পরিবর্তন না করেই কলযোগ্য ফাংশন, পদ্ধতি বা ক্লাসের আচরণ প্রসারিত ও পরিবর্তন করতে পারে। সংক্ষেপে আমরা বলতে পারি যে তারা কলযোগ্য বস্তু যা ফাংশন বা ক্লাস পরিবর্তন করতে ব্যবহৃত হয়।
ফাংশন ডেকোরেটর হল ফাংশন যা আর্গুমেন্ট হিসাবে ফাংশন রেফারেন্স গ্রহণ করে এবং তাদের চারপাশে একটি মোড়ক যোগ করে এবং একটি নতুন ফাংশন হিসাবে র্যাপার সহ ফাংশনটি ফেরত দেয়।
আসুন ফাংশন ডেকোরেটরকে বাই একটি উদাহরণ বুঝি:
কোড1
@decorator def func(arg): return "value"
উপরের কোডটি একই রকম:
কোড২
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!'