دکوراتور در پایتون ابزاری قدرتمند است که امکان افزودن یا تغییر عملکرد توابع را بدون نیاز به تغییر در کد اصلی فراهم میکند. در این مقاله از کد اکسپلور، به بررسی دکوراتورها و کاربردهای آنها میپردازیم تا به شما در نوشتن برنامههای کارآمدتر و تمیزتر کمک کنیم.
فهرست محتوا
دکوراتور در پایتون چیست؟
دکوراتور یک تابع است که تابع دیگری را میگیرد و بدون تغییر کد اصلی، رفتار آن را گسترش میدهد. دکوراتورها در پایتون برای بهبود کارایی، کاهش تکرار کد و سهولت در دیباگینگ مورد استفاده قرار میگیرند.
چرا از دکوراتورها استفاده میکنیم؟
دکوراتورها در پایتون به شما این امکان را میدهند که از کدهای تکراری جلوگیری کرده و قابلیت استفاده مجدد از توابع را افزایش دهید. به عنوان مثال، برای اندازهگیری زمان اجرای چندین تابع، به جای نوشتن کد برای هر تابع، میتوانید از یک دکوراتور زمانسنج استفاده کنید و آن را به توابع مورد نظر اعمال کنید.
ساختار دکوراتورها
برای درک بهتر دکوراتورها، باید با برخی مفاهیم اساسی پایتون آشنا باشید:
توابع مرتبه اول
در پایتون، توابع «مرتبه اول» هستند، به این معنی که میتوان آنها را به متغیرها اختصاص داد، به توابع دیگر ارسال کرد، یا به عنوان خروجی از توابع بازگرداند.
مثال:
def greet(name): # Return a greeting message return f"سلام {name}" welcome = greet print(welcome("علی"))
تعریف توابع داخل توابع
در پایتون میتوانید تابعی را داخل تابع دیگر تعریف کنید.
def parent(): # Parent function print("در حال اجرا parent()") def child(): # Nested child function print("در حال اجرا child()") child()
توابع به عنوان آرگومان
میتوان توابع را به عنوان آرگومان به توابع دیگر ارسال کرد.
def execute(func): # Execute the passed function func() def greet(): # Print a greeting message print("سلام!") execute(greet)
ایجاد یک Decorator ساده
حالا بیایید یک Decorator ساده ایجاد کنیم که قبل و بعد از اجرای تابع، پیامی چاپ کند.
def decorator(func): # Define the decorator function def wrapper(): print("قبل از اجرای تابع") func() print("بعد از اجرای تابع") return wrapper @decorator def greet(): # The function to be decorated print("سلام دنیا!") greet()
خروجی:
قبل از اجرای تابع سلام دنیا! بعد از اجرای تابع
استفاده از Decoratorها با آرگومانها
اگر تابعی که Decorator میکنیم دارای آرگومان باشد، میتوانیم از *args
و **kwargs
استفاده کنیم تا این آرگومانها را مدیریت کنیم.
def decorator(func): # Define the decorator function def wrapper(*args, **kwargs): print("در حال اجرای تابع با آرگومانها") return func(*args, **kwargs) return wrapper @decorator def add(a, b): # Function that adds two numbers return a + b result = add(5, 3) print(f"نتیجه: {result}")
خروجی:
در حال اجرای تابع با آرگومانها نتیجه: 8
Decoratorهای تو در تو
میتوان چندین Decorator را بر روی یک تابع اعمال کرد.
def decorator1(func): # First decorator def wrapper(): print("دکوراتور 1") func() return wrapper def decorator2(func): # Second decorator def wrapper(): print("دکوراتور 2") func() return wrapper @decorator1 @decorator2 def greet(): # Function to be decorated print("سلام!") greet()
خروجی:
دکوراتور 1 دکوراتور 2 سلام!
دکوراتورهای با آرگومان
گاهی اوقات نیاز داریم دکوراتوری ایجاد کنیم که خودش آرگومان دریافت کند.
def repeat(times): # Decorator factory that repeats function execution def decorator(func): def wrapper(*args, **kwargs): for _ in range(times): func(*args, **kwargs) return wrapper return decorator @repeat(3) def greet(name): # Function that greets a person print(f"سلام {name}!") greet("علی")
خروجی:
سلام علی! سلام علی! سلام علی!
سوالات شما
دکوراتور در پایتون چیست؟
دکوراتور تابعی است که ویژگیهای جدیدی به تابع یا کلاس دیگر اضافه میکند بدون تغییر کد اصلی. برای بهبود لاگگیری، زمانسنجی و کنترل دسترسی استفاده میشود.
آیا باید از دکوراتورها در پایتون استفاده کنید؟
بله، دکوراتورها کد را خواناتر و قابلاستفاده مجدد میکنند و به کاهش کد تکراری کمک میکنند، مخصوصاً برای کاربردهایی مثل اعتبارسنجی و لاگگیری.
ژنراتور و دکوراتور در پایتون چیست؟
ژنراتور تابعی است که با yield
مقداردهی میکند و دادهها را به صورت تنبل ایجاد میکند. دکوراتور عملکرد تابع را با تغییر یا افزودن رفتار گسترش میدهد.
دکوراتور در جنگو چیست؟
دکوراتورها در جنگو برای مدیریت دسترسی و اعتبارسنجی کاربران در ویوها استفاده میشوند؛ مثلاً @login_required
دسترسی را محدود به کاربران وارد شده میکند.
صحبت آخر
Decorator در پایتون ابزاری قدرتمند برای بهبود و گسترش عملکرد توابع هستند، بدون اینکه نیازی به تغییر در کد اصلی باشد. با استفاده از Decorator، میتوان کدی تمیزتر، ماژولارتر و قابل نگهداریتر نوشت.
همچنین، اگر سؤال یا تجربهای در مورد استفاده از دکوراتورها دارید، خوشحال میشویم آن را در بخش نظرات با ما و دیگر کاربران کد اکسپلور به اشتراک بگذارید.
عکس اصلی: Real Python
منبع: