Dataclass در پایتون یک ویژگی قدرتمند است که در نسخه 3.7 معرفی شد تا تعریف کلاسهای دادهمحور را ساده، خوانا و کمهزینه کند. زمانی که هدف اصلی یک کلاس فقط نگهداری داده باشد و نه منطق پیچیده، دیتاکلسها بهترین انتخاب هستند.
در گذشته برای تعریف کلاسهایی که فقط شامل چند فیلد بودند، مجبور بودیم بهصورت دستی متدهایی مثل __init__، __repr__، __eq__ و ... را بنویسیم. dataclass این کارها را بهصورت خودکار و فقط با یک دکوراتور انجام میدهد.
چرا Dataclass ایجاد شد و چه مشکلی را حل میکند؟
- کاهش کدهای تکراری که برای نگهداری داده استفاده میشدند.
- افزایش سرعت توسعه با حذف متدهای تکراری مثل
__init__و__repr__. - تعریف مدلهای دادهای تمیز، خوانا و استاندارد.
- بهبود نگهداری و توسعهٔ کد با حذف boilerplate code.
- امکان استفاده از ویژگیهای تکمیلی برای کنترل مقداردهی، مقایسه، immutability و …
عملکردهای کلیدی و قابلیتهای Dataclass
- تولید خودکار متدها: ایجاد اتوماتیک
__init__،__repr__،__eq__و ... بر اساس فیلدها. - پشتیبانی از پیشفرضها: تعریف مقدار پیشفرض برای فیلدها بدون پیچیدگی.
- تعریف کلاسهای immutable: با
frozen=Trueامکان ساخت آبجکتهای غیرقابل تغییر. - پشتیبانی از فیلدهای پیشرفته: مثل
field(default_factory=...)برای لیستها و دیکشنریها. - مقایسهٔ خودکار آبجکتها: dataclass میتواند آبجکتها را بر اساس فیلدها با هم مقایسه کند.
- کاهش چشمگیر boilerplate code: کوچکتر، خواناتر و استاندارد بودن تعریف مدلهای دادهای.
تفاوت Dataclass با روشهای قدیمی (کلاسهای معمولی)
| روش قدیمی | Dataclass |
|---|---|
نیاز به نوشتن دستی __init__ |
تولید خودکار __init__ |
نوشتن __repr__ برای نمایش خوانا |
نمایش خودکار و استاندارد |
| مقایسهٔ آبجکتها نیاز به پیادهسازی دستی | مقایسهٔ خودکار با مقدار فیلدها |
| احتمال زیاد برای خطای انسانی در تعریف متدهای تکراری | کاهش خطا و کد کمتر |
| تعریف پیشفرضهای پیچیده دشوار است | امکان استفاده از default_factory |
به صورت خلاصه، dataclass ابزار سادهسازی مدلسازی داده در پایتون است؛ مخصوصاً زمانی که کلاس شما فقط برای نگهداری داده ایجاد شده باشد. این ویژگی باعث کاهش کدهای تکراری و افزایش خوانایی و استانداردسازی ساختار پروژه میشود.
در اینجا نمونهای از یک کلاس معمولی در پایتون را در مقابل همان ساختار با استفاده از dataclass مشاهده میکنید. این مثال نشان میدهد چگونه دیتاکلسها بخش بزرگی از کدهای تکراری را حذف و مدیریت داده را ساده میکنند.
روش قدیمی (کلاس معمولی با کدهای تکراری):
class User:
def __init__(self, name: str, age: int, active: bool = True):
self.name = name
self.age = age
self.active = active
def __repr__(self):
return f"User(name={self.name}, age={self.age}, active={self.active})"
def __eq__(self, other):
if not isinstance(other, User):
return False
return (self.name, self.age, self.active) == (other.name, other.age, other.active)
user1 = User("Ali", 30)
user2 = User("Ali", 30)
print(user1)
print(user1 == user2)
در مثال بالا مجبور هستیم __init__، __repr__ و __eq__ را به صورت دستی تعریف کنیم.
روش جدید با Dataclass (کد بسیار کمتر، خوانایی بیشتر):
from dataclasses import dataclass
@dataclass
class User:
name: str
age: int
active: bool = True
user1 = User("Ali", 30)
user2 = User("Ali", 30)
print(user1)
print(user1 == user2)
در این نسخه:
__init__به صورت خودکار ساخته میشود.__repr__خودکار و خواناست.__eq__بدون نیاز به تعریف، مقدار فیلدها را مقایسه میکند.- کلاس بسیار کوچکتر، تمیزتر و استانداردتر شده است.
این مثال دقیقاً نشان میدهد که چرا dataclass ایجاد شد: حذف کدهای تکراری و تسهیل ساخت مدلهای دادهای.