Python Decorators: Simplifying Code – DEV Community
Summarize this content to 400 words in Persian Lang
دکوراتورها در پایتون ابزار قدرتمندی هستند که به شما امکان میدهند رفتار توابع یا روشها را بدون تغییر کد منبع آنها تغییر دهید. آنها روشی تمیز برای افزودن عملکرد ارائه می دهند و به طور گسترده برای ورود به سیستم، اجرای قوانین و بهینه سازی عملکرد استفاده می شوند.
در این پست، شش دکوراتور رایج پایتون را با مثالهای ساده بررسی میکنیم.
1 – @staticmethod: تعریف روش های استاتیک
دکوراتور @staticmethod متدهایی ایجاد می کند که به داده های نمونه (self) یا کلاس (cls) دسترسی ندارند. مانند یک تابع معمولی عمل می کند اما می تواند از کلاس یا یک نمونه فراخوانی شود.
مثال:
class MyClass:
@staticmethod
def greet():
return “Hello from static method!”
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
2 – @classmethod: متدهای کلاس را تعریف کنید
دکوراتور @classmethod به شما امکان می دهد متدهایی را تعریف کنید که کلاس (cls) را به عنوان اولین آرگومان می گیرند. این برای روش های کارخانه یا تغییر وضعیت کلاس مفید است.
مثال:
class MyClass:
count = 0
@classmethod
def increment_count(cls):
cls.count += 1
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
3 – @property: ویژگی های فقط خواندنی را تعریف کنید
دکوراتور @property اجازه می دهد تا به روش ها مانند ویژگی ها دسترسی داشته باشید. زمانی مفید است که میخواهید دسترسی به یک ویژگی را بدون افشای پیادهسازی داخلی کنترل کنید.
مثال:
class Circle:
def __init__(self, radius):
self._radius = radius
@property
def area(self):
return 3.14 * self._radius ** 2
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
4 – @functools.lru_cache: نتایج عملکرد گران قیمت حافظه پنهان
دکوراتور @lru_cache (از functools) نتایج فراخوانی تابع را در حافظه پنهان ذخیره می کند تا از محاسبه مجدد جلوگیری شود. این می تواند به طور قابل توجهی عملکرد عملکردهای گران قیمت یا اغلب نامیده می شود را بهبود بخشد.
مثال:
from functools import lru_cache
@lru_cache(maxsize=32)
def expensive_computation(x):
return x ** 2
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
5 – @functools.wraps: حفظ متادیتا در دکوراتورهای سفارشی
هنگام نوشتن دکوراتورهای سفارشی، دکوراتور @wraps ابرداده (نام، رشته سند) تابع اصلی را حفظ میکند و اطمینان میدهد که ابزارهای درون نگری همچنان کار میکنند.
مثال:
from functools import wraps
def my_decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
6 – @dataclass: ساده کردن تعاریف کلاس
دکوراتور @dataclass (از ماژول dataclasses) به طور خودکار روش هایی مانند تولید می کند init() و نماینده() برای کلاس ها. برای کلاس های نگهداری داده مناسب است.
مثال:
from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
نتیجه گیری
دکوراتورهای پایتون مانند @staticmethod، @classmethod، @property، @lru_cache، @wraps، و @dataclass به نوشتن کدهای پاکتر و کارآمدتر با قرار دادن قابلیتها در اطراف متدها و توابع کمک میکنند. آنها ابزارهای همه کاره ای هستند که می توانند بسیاری از کارهای برنامه نویسی را ساده کنند.
منابع
تعریف دکوراتور پایتون@staticmethod@classmethod@property@functools.lru_cache@functools.wraps@dataclass
دکوراتورها در پایتون ابزار قدرتمندی هستند که به شما امکان میدهند رفتار توابع یا روشها را بدون تغییر کد منبع آنها تغییر دهید. آنها روشی تمیز برای افزودن عملکرد ارائه می دهند و به طور گسترده برای ورود به سیستم، اجرای قوانین و بهینه سازی عملکرد استفاده می شوند.
در این پست، شش دکوراتور رایج پایتون را با مثالهای ساده بررسی میکنیم.
1 – @staticmethod: تعریف روش های استاتیک
دکوراتور @staticmethod متدهایی ایجاد می کند که به داده های نمونه (self) یا کلاس (cls) دسترسی ندارند. مانند یک تابع معمولی عمل می کند اما می تواند از کلاس یا یک نمونه فراخوانی شود.
مثال:
class MyClass:
@staticmethod
def greet():
return "Hello from static method!"
2 – @classmethod: متدهای کلاس را تعریف کنید
دکوراتور @classmethod به شما امکان می دهد متدهایی را تعریف کنید که کلاس (cls) را به عنوان اولین آرگومان می گیرند. این برای روش های کارخانه یا تغییر وضعیت کلاس مفید است.
مثال:
class MyClass:
count = 0
@classmethod
def increment_count(cls):
cls.count += 1
3 – @property: ویژگی های فقط خواندنی را تعریف کنید
دکوراتور @property اجازه می دهد تا به روش ها مانند ویژگی ها دسترسی داشته باشید. زمانی مفید است که میخواهید دسترسی به یک ویژگی را بدون افشای پیادهسازی داخلی کنترل کنید.
مثال:
class Circle:
def __init__(self, radius):
self._radius = radius
@property
def area(self):
return 3.14 * self._radius ** 2
4 – @functools.lru_cache: نتایج عملکرد گران قیمت حافظه پنهان
دکوراتور @lru_cache (از functools) نتایج فراخوانی تابع را در حافظه پنهان ذخیره می کند تا از محاسبه مجدد جلوگیری شود. این می تواند به طور قابل توجهی عملکرد عملکردهای گران قیمت یا اغلب نامیده می شود را بهبود بخشد.
مثال:
from functools import lru_cache
@lru_cache(maxsize=32)
def expensive_computation(x):
return x ** 2
5 – @functools.wraps: حفظ متادیتا در دکوراتورهای سفارشی
هنگام نوشتن دکوراتورهای سفارشی، دکوراتور @wraps ابرداده (نام، رشته سند) تابع اصلی را حفظ میکند و اطمینان میدهد که ابزارهای درون نگری همچنان کار میکنند.
مثال:
from functools import wraps
def my_decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper
6 – @dataclass: ساده کردن تعاریف کلاس
دکوراتور @dataclass (از ماژول dataclasses) به طور خودکار روش هایی مانند تولید می کند init() و نماینده() برای کلاس ها. برای کلاس های نگهداری داده مناسب است.
مثال:
from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
نتیجه گیری
دکوراتورهای پایتون مانند @staticmethod، @classmethod، @property، @lru_cache، @wraps، و @dataclass به نوشتن کدهای پاکتر و کارآمدتر با قرار دادن قابلیتها در اطراف متدها و توابع کمک میکنند. آنها ابزارهای همه کاره ای هستند که می توانند بسیاری از کارهای برنامه نویسی را ساده کنند.
منابع
تعریف دکوراتور پایتون
@staticmethod
@classmethod
@property
@functools.lru_cache
@functools.wraps
@dataclass