آموزش پایتون - جنریک‌ها

در پایتون، جنریک‌ها (Generics) سازوکاری هستند که به کمک آن می‌توانید توابع، کلاس‌ها یا متدهایی تعریف کنید که با انواع مختلف داده کار می‌کنند و در عین حال ایمنی نوع داده را حفظ می‌کنند. با پیاده‌سازی جنریک‌ها، می‌توان کدی قابل استفاده مجدد نوشت که با انواع مختلف داده سازگار باشد. این قابلیت به افزایش انعطاف‌پذیری کد و اطمینان از صحت نوع داده‌ها کمک می‌کند.

معمولاً در برنامه‌نویسی پایتون نیازی نیست نوع متغیر را به‌صورت صریح مشخص کنید. نوع متغیر به‌صورت پویا و بر اساس مقداری که به آن اختصاص داده می‌شود، تعیین می‌شود. مفسر پایتون بررسی نوع داده را انجام نمی‌دهد و به همین دلیل ممکن است در زمان اجرای برنامه استثناهایی رخ دهند.

پایتون از نسخه 3.5، جنریک‌ها را همراه با راهنمای نوع داده (Type Hints) معرفی کرد. این قابلیت به شما اجازه می‌دهد نوع مورد انتظار متغیرها، آرگومان‌های توابع و مقادیر بازگشتی را مشخص کنید. این ویژگی به کاهش خطاهای زمان اجرا و بهبود خوانایی کد کمک می‌کند.

جنریک‌ها مفهوم راهنمای نوع داده را گسترش می‌دهند و با معرفی متغیرهای نوع (Type Variables)، امکان تعریف انواع عمومی را فراهم می‌کنند. این انواع عمومی هنگام استفاده از تابع یا کلاس جنریک، می‌توانند با انواع مشخص جایگزین شوند.

تعریف یک تابع جنریک

بیایید مثال زیر را بررسی کنیم که یک تابع جنریک را تعریف می‌کند:

from typing import List, TypeVar, Generic
T = TypeVar('T')
def reverse(items: List[T]) -> List[T]:
   return items[::-1]

در اینجا، تابعی جنریک به نام 'reverse' تعریف می‌کنیم. این تابع یک فهرست ('List[T]') را به‌عنوان آرگومان دریافت می‌کند و فهرستی از همان نوع را برمی‌گرداند. متغیر نوع 'T' نشان‌دهنده نوع عمومی است که هنگام استفاده از تابع، با یک نوع مشخص جایگزین می‌شود.

فراخوانی تابع جنریک با انواع مختلف داده

تابع reverse() با انواع مختلف داده فراخوانی می‌شود:

numbers = [1, 2, 3, 4, 5]
reversed_numbers = reverse(numbers)
print(reversed_numbers)

fruits = ['apple', 'banana', 'cherry']
reversed_fruits = reverse(fruits)
print(reversed_fruits)

خروجی زیر تولید می‌شود:

[5, 4, 3, 2, 1]
['cherry', 'banana', 'apple']

تعریف یک کلاس جنریک

معمولاً برای تعریف یک نوع جنریک، فهرستی از پارامترهای نوع را پس از نام کلاس قرار می‌دهند. مثال زیر نحوه استفاده از جنریک‌ها در یک کلاس جنریک را نشان می‌دهد:

from typing import List, TypeVar, Generic
T = TypeVar('T')
class Box(Generic[T]):
   def __init__(self, item: T):
      self.item = item
   def get_item(self) -> T:
      return self.item
Let us create objects of the above generic class with int and str type
box1 = Box(42)
print(box1.get_item())

box2 = Box('Hello')
print(box2.get_item())

خروجی زیر تولید می‌شود:

42
Hello

پیشرفت مطالعه: وضعیت خوانده‌شدن این درس فقط در همین مرورگر ذخیره می‌شود؛ بدون نیاز به حساب کاربری.