ডেকোরেটর (Decorator) পাইথনের একটি শক্তিশালী এবং নমনীয় বৈশিষ্ট্য, যা ফাংশন বা মেথডের আচরণ পরিবর্তন করতে বা প্রসারিত করতে ব্যবহার করা হয়। ডেকোরেটর মূলত একটি ফাংশনকে ইনপুট হিসেবে গ্রহণ করে এবং আরেকটি ফাংশন রিটার্ন করে। এটি মূল ফাংশনের কোনো পরিবর্তন না করে নতুন ফাংশনালিটি যোগ করতে সহায়ক।
ডেকোরেটরের গঠন
ডেকোরেটরের মাধ্যমে একটি ফাংশন বা মেথডের উপর অতিরিক্ত কার্যকারিতা যোগ করা যায়। এটি @decorator_name সিনট্যাক্স দিয়ে ব্যবহার করা হয়।
@decorator_name
def function_to_decorate():
pass
নিচে একটি সাধারণ উদাহরণসহ ব্যাখ্যা করা হলো।
ডেকোরেটরের উদাহরণ
ধরা যাক, আমরা একটি ফাংশন তৈরি করবো যা প্রতিটি কলের আগে এবং পরে কিছু মেসেজ প্রিন্ট করবে।
১. সাধারণ ডেকোরেটর তৈরি করা
def my_decorator(func):
def wrapper():
print("Function is about to run.")
func()
print("Function has finished running.")
return wrapper
এখানে, my_decorator একটি ডেকোরেটর ফাংশন যা একটি func ফাংশন গ্রহণ করে এবং একটি wrapper ফাংশন রিটার্ন করে। wrapper ফাংশন মূল ফাংশন কলের আগে এবং পরে মেসেজ প্রিন্ট করে।
২. ডেকোরেটর ব্যবহার করা
@my_decorator
def say_hello():
print("Hello, World!")
say_hello()
আউটপুট হবে:
Function is about to run.
Hello, World!
Function has finished running.
এখানে @my_decorator ব্যবহার করে আমরা say_hello ফাংশনের উপর ডেকোরেটর প্রয়োগ করেছি, যা say_hello ফাংশনের আগে এবং পরে মেসেজ প্রিন্ট করে।
আর্গুমেন্টসহ ডেকোরেটর
ডেকোরেটর তৈরি করা যেতে পারে যা ফাংশনের আর্গুমেন্ট গ্রহণ করতে পারে। এর জন্য *args এবং **kwargs ব্যবহার করতে হবে।
def my_decorator(func):
def wrapper(*args, **kwargs):
print("Function is about to run.")
result = func(*args, **kwargs)
print("Function has finished running.")
return result
return wrapper
এখন, আমরা একটি ফাংশন ডেকোরেট করবো যাতে আর্গুমেন্ট পাঠানো যায়।
@my_decorator
def add(a, b):
return a + b
print("Result:", add(5, 3))
আউটপুট:
Function is about to run.
Function has finished running.
Result: 8
ডেকোরেটরের ব্যবহার
ডেকোরেটর ব্যবহার করে প্রোগ্রামে বিভিন্ন সুবিধা যুক্ত করা যায়। কিছু সাধারণ ব্যবহার নিচে আলোচনা করা হলো:
লগিং (Logging): ফাংশন কলের সময় লগ মেসেজ প্রিন্ট করতে।
অথেনটিকেশন: কোনো ফাংশনে অথেনটিকেশন বা অনুমোদন প্রক্রিয়া যোগ করতে।
টাইমিং (Timing): একটি ফাংশন কত সময় নিচ্ছে তা মাপতে।
টাইমিং ডেকোরেটর উদাহরণ
import time
def timer_decorator(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"Function took {end_time - start_time} seconds to complete.")
return result
return wrapper
@timer_decorator
def slow_function():
time.sleep(2)
print("Function is done.")
slow_function()
আউটপুট:
Function is done.
Function took 2.0001234 seconds to complete.
এখানে timer_decorator ডেকোরেটরের মাধ্যমে slow_function এর রান টাইম মাপা হয়েছে।
ডেকোরেটর চেইনিং
একাধিক ডেকোরেটর একটি ফাংশনের উপর প্রয়োগ করা যেতে পারে। এটি ডেকোরেটর চেইনিং হিসেবে পরিচিত।
def decorator1(func):
def wrapper():
print("Decorator 1")
func()
return wrapper
def decorator2(func):
def wrapper():
print("Decorator 2")
func()
return wrapper
@decorator1
@decorator2
def say_hello():
print("Hello, World!")
say_hello()
আউটপুট হবে:
Decorator 1
Decorator 2
Hello, World!
এখানে, decorator2 প্রথমে say_hello এর উপর প্রয়োগ করা হয়েছে এবং তারপর decorator1 প্রয়োগ করা হয়েছে।
সারসংক্ষেপ
ডেকোরেটর পাইথনে ফাংশনের আচরণ প্রসারিত করতে ব্যবহৃত একটি শক্তিশালী টুল। এটি নতুন ফাংশনালিটি যোগ করতে সহায়ক, যেমন লগিং, অথেনটিকেশন, টাইমিং ইত্যাদি। ডেকোরেটর কোডকে আরও মডুলার, পরিষ্কার এবং পুনঃব্যবহারযোগ্য করে।