دکوراتور پایتون چیست؟

📌 دکوراتور پایتون چیست؟
بوها دکوراتور پایتون تابعی است که عملکرد یا کلاس دیگری را تغییر می دهد بدون تغییر کد اصلی آنبشر
مقاله کامل را در این مورد بخوانید
✅ این قابلیت های اضافی (به عنوان مثال ، ورود به سیستم ، احراز هویت ، ذخیره سازی) را به توابع یا روش ها اضافه می کند.
✅ استفاده می کند @decorator_name
نحو برای بسته بندی یک تابع.
✅ نمونه اصلی دکوراتور پایتون
📌 بدون دکوراتور (روش دستی):
def uppercase_decorator(func):
def wrapper():
result = func()
return result.upper()
return wrapper
def say_hello():
return "hello world"
# Manually applying decorator
say_hello = uppercase_decorator(say_hello)
print(say_hello()) # Output: "HELLO WORLD"
❌ مشکل: ما باید به صورت دستی بسته بندی کنیم say_hello
درون uppercase_decorator
بشر
📌 با دکوراتور (روش تمیز کننده):
def uppercase_decorator(func):
def wrapper():
result = func()
return result.upper()
return wrapper
@uppercase_decorator # ✅ This automatically applies the decorator
def say_hello():
return "hello world"
print(say_hello()) # Output: "HELLO WORLD"
✅ چرا این بهتر است؟
- بسته بندی دستی کمتربشر
- خواندن و نگهداری آسان تربشر
✅ نحوه کار دکوراسیون ها (گام به گام)
@uppercase_decorator
def say_hello():
return "hello world"
1⃣ پایتون می بیند @uppercase_decorator
و آن را در say_hello
بشر
2 uppercase_decorator(say_hello)
به طور خودکار نامیده می شودبشر
3⃣ بازگشت wrapper()
عملکردی که اصلاح کردن say_hello()
خروجیبشر
4⃣ say_hello()
اکنون برمی گردد "HELLO WORLD"
به جای "hello world"
بشر
✅ نمونه های دکوراسیون در دنیای واقعی
🔹 مثال 1: دکوراتور ورود به سیستم
def log_decorator(func):
def wrapper(*args, **kwargs):
print(f"Calling {func.__name__} with {args} {kwargs}")
result = func(*args, **kwargs)
print(f"{func.__name__} returned {result}")
return result
return wrapper
@log_decorator
def add(a, b):
return a + b
add(5, 3)
💡 خروجی:
Calling add with (5, 3) {}
add returned 8
✅ چرا از این استفاده می کنیم؟
- به طور خودکار تماس ها و نتایج عملکرد را ثبت می کند بدون اصلاح خود عملکردبشر
🔹 مثال 2: دکوراتور احراز هویت در Fastapi
from fastapi import FastAPI, Depends, HTTPException
app = FastAPI()
def auth_required(func):
def wrapper(username: str):
if username != "admin":
raise HTTPException(status_code=403, detail="Unauthorized")
return func(username)
return wrapper
@app.get("/secure-data")
@auth_required # ✅ Protects this route
def secure_data(username: str):
return {"message": "Secure data accessed!"}
# Now only "admin" can access this route
✅ چرا از این استفاده می کنیم؟
- فقط کاربران معتبر را تضمین می کند می تواند به برخی از مسیرهای API دسترسی پیدا کند.
🔹 مثال 3: دکوراتور اجرای زمان
import time
def time_it(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"{func.__name__} took {end_time - start_time:.4f} seconds")
return result
return wrapper
@time_it
def slow_function():
time.sleep(2)
return "Finished"
slow_function()
💡 خروجی:
slow_function took 2.0001 seconds
✅ چرا از این استفاده می کنیم؟
- زمان اجرای یک عملکرد را اندازه گیری می کند (برای بهینه سازی عملکرد مفید است).
✅ خلاصه: چرا از دکوراتورهای پایتون استفاده می کنید؟
نشان | چرا مفید است؟ |
---|---|
قابلیت استفاده مجدد کد | بدون تغییر کد عملکرد ، رفتار اضافی اضافه کنید. |
خوانایی |
@decorator_name روشن می کند که عملکرد اصلاح شده است. |
انعطاف پذیری | قابل استفاده است چندین عملکرد به راحتیبشر |
در چارچوب ها استفاده می شود | Fastapi ، Django ، Flask ، Tensorflow همه از دکوراتورها استفاده می کنند. |