ডেকোরেটর হলো ফাংশনকে র্যাপ করে তার আচরণ পরিবর্তন/বাড়ানো কৌশল। একাধিক ডেকোরেটর চেইন করে ব্যবহার করা যায় — নিচের ডেকোরেটর আগে এক্সিকিউট হয়।
উদাহরণ: Bold + Italic চেইন
def makebold(fn):
def wrapped():
return "" + fn() + ""
return wrapped
def makeitalic(fn):
def wrapped():
return "" + fn() + ""
return wrapped
@makebold
@makeitalic
def hello():
return "hello world"
print(hello()) # hello world
এক্সিকিউশন অর্ডার
@makebold @makeitalic def hello(): ... # সমতুল্য: hello = makebold(makeitalic(hello))
- প্রথমে
makeitalic(hello)কল হয় → রিটার্ন করেwrapped(italic wrapper)। - তারপর
makebold(...)কল হয় → রিটার্ন করেwrapped(bold wrapper)। - ফাইনাল
helloহলো bold(wrapped(italic(wrapped(original))))।
আর্গামেন্ট গ্রহণকারী ডেকোরেটর
def repeat(times):
def decorator(fn):
def wrapped(*args, **kwargs):
for _ in range(times):
result = fn(*args, **kwargs)
return result
return wrapped
return decorator
@repeat(3)
def greet(name):
print(f"Hello {name}")
greet("Alice") # Hello Alice (x3)
functools.wraps — মেটাডেটা সংরক্ষণ
from functools import wraps
def my_decorator(fn):
@wraps(fn)
def wrapped(*args, **kwargs):
return fn(*args, **kwargs)
return wrapped
@wraps দিয়ে অরিজিনাল ফাংশনের __name__, __doc__, __annotations__ সংরক্ষণ থাকে।