معرفی DataClass

  • مدرس : علی بیگدلی
  • تاریخ انتشار: 1404/09/14
  • تعداد بازدید: 3

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 ایجاد شد: حذف کدهای تکراری و تسهیل ساخت مدل‌های داده‌ای.

ثبت دیدگاه


نکته: آدرس ایمیل شما منتشر نخواهد شد
0/600

دیدگاه کاربران (0)


هیچ دیدگاهی ثبت نشده است. می‌توانید اولین نفر باشید.