دکوراتور در پایتون

دکوراتورها در پایتون میتوانند نقش مهمی داشته باشند. دکوراتورها این امکان را به ما میدهند که عملکرد یک تابع را بدون اینکه کد جدیدی در فایل اصلی بزنیم، به راحتی عوض کنیم. هر وقت هم فکر کردید دیگر نیازی به آن تغییر ندارید به راحتی برش میدارید و همه چیز مثل اول میشود. با کداکسپلور همراه باشید تا در ادامه دکوراتورها را بررسی کنیم.
فهرست محتوا
دکوراتور در پایتون چیست؟
به زبان ساده دکوراتورها خودشان یک تابعی هستند که تابع ما را ورودی میگیرند. یک مثال خیلی سریع، پروفایل کردن یک تابع است. شما میتوانید با دکوراتورها به سادگی کد خود را در کنار تابعهایتان اجرا کنید و هر موقع خواستید برشان دارید.
چرا از دکوراتورها استفاده میکنیم؟
به چند دلیل! یکی از دلیلها جلوگیری از کدهای تکراری هست که شما ممکنه استفاده کنید. برای مثال:
برای مثال پروفایل کردن چندین تابع شما یا میتوانید به تعداد همان تابع کد اندازهگیری بنویسید یا یک بار تعریف کنید و برای توابعتون استفاده کنید. مثل آب خوردن!
ساختار دکوراتورها
دیگه وقتش هست با دکوراتورها به صورت عملی آشنا بشیم. دکوراتورها خود چندین نوع هستند که به ترتیب بررسیشون میکنیم.
توابع مرتبه اول
اینطوری در نظر بگیرید که توابع در پایتون مرتبه اول هستند، یعنی اینکه میتوانیم آنها در متغیری ذخیره کنیم به تابعی ارسال کنیم و حتی به عنوان خروجی یک تابع برگردانیم و در یک متغیر ذخیره کنیم.
مثال:
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 ساده
حالا وقتش رسیده یک دکوراتور درست کنیم! هدف از ایجاد دکوراتورمون، چاپ یک پیام قبل و بعد یک تابع هست.
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ها با آرگومانها
حالا جالب هست که بدونید اگر تابعی که داریم براش از دکوراتور استفاده میکنیم خودش هم ورودی داشته باشد، میتوانیم با استفاده از *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های تو در تو
شاید براتون سوال بشه که آیا میشه چندین دکوراتور را در یک تابع اعمال کرد؟ بله میشه!
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
دسترسی را محدود به کاربران وارد شده میکند.
صحبت آخر
در این مقاله سعی کردیم نگاه کلی به دکوراتورها داشته باشیم. فهمیدیم که هدف استفاده از دکوراتورها چی میتوانند باشند. اما اگه هنوز بخشی براتون نامفهوم هست، منتظر شما در بخش نظرات هستیم!
عکس اصلی: Real Python
منبع:
دیدگاهتان را بنویسید