آموزش پایتون - مفهوم اتصال پویا

در برنامه‌نویسی شیءگرا، مفهوم اتصال پویا ارتباط نزدیکی با چندریختی دارد. در پایتون، اتصال پویا فرایند تعیین متد یا ویژگی مناسب در زمان اجرا است، نه در زمان کامپایل.

بر اساس ویژگی چندریختی، اشیای مختلف بر اساس پیاده‌سازی‌های خود، به فراخوانی یک متد یکسان به شکل‌های متفاوتی پاسخ می‌دهند. این رفتار از طریق بازنویسی متد حاصل می‌شود؛ یعنی زمانی که یک زیرکلاس، پیاده‌سازی مخصوص خود را از یک متد تعریف‌شده در ابرکلاس ارائه می‌دهد.

مفسر پایتون در زمان اجرا و بر اساس نوع شیء یا سلسله‌مراتب کلاس آن، مشخص می‌کند که کدام متد یا ویژگی باید فراخوانی شود. این بدان معناست که متد یا ویژگی موردنظر برای فراخوانی، به‌صورت پویا و بر اساس نوع واقعی شیء تعیین می‌شود.

مثال

مثال زیر اتصال پویا در پایتون را نشان می‌دهد:

class shape:
   def draw(self):
      print ("draw method")
      return

class circle(shape):
   def draw(self):
      print ("Draw a circle")
      return

class rectangle(shape):
   def draw(self):
      print ("Draw a rectangle")
      return

shapes = [circle(), rectangle()]
for shp in shapes:
   shp.draw()

کد بالا خروجی زیر را تولید می‌کند:

Draw a circle
Draw a rectangle

همان‌طور که می‌بینید، متد draw() به‌صورت پویا و بر اساس نوع شیء، به پیاده‌سازی متناظر آن متصل می‌شود. اتصال پویا در پایتون به همین شکل پیاده‌سازی می‌شود.

تایپ‌دهی اردکی

مفهوم دیگری که ارتباط نزدیکی با اتصال پویا دارد، تایپ‌دهی اردکی است. مناسب بودن یک شیء برای کاربردی خاص، بر اساس وجود متدها یا ویژگی‌های مشخصی در آن تعیین می‌شود، نه بر اساس نوع آن. این ویژگی انعطاف‌پذیری بیشتر و استفاده مجدد از کد را در پایتون امکان‌پذیر می‌کند.

تایپ‌دهی اردکی یکی از ویژگی‌های مهم زبان‌های دارای تایپ‌دهی پویا، مانند پایتون (پرل، روبی، PHP، جاوااسکریپت و غیره) است که به‌جای تمرکز بر نوع مشخص یک شیء، بر رفتار آن تأکید می‌کند. بر اساس مفهوم «تایپ‌دهی اردکی»، «اگر چیزی مثل اردک راه برود و مثل اردک صدای اردک دربیاورد، پس باید اردک باشد.»

تایپ‌دهی اردکی این امکان را فراهم می‌کند که اشیایی با انواع مختلف، در صورتی که متدها یا ویژگی‌های موردنیاز را داشته باشند، به‌جای یکدیگر استفاده شوند. هدف این مفهوم، افزایش انعطاف‌پذیری و استفاده مجدد از کد است. این رویکرد مفهومی گسترده‌تر است که بر رفتار و رابط اشیا تأکید دارد، نه بر انواع رسمی آن‌ها.

در ادامه، نمونه‌ای از تایپ‌دهی اردکی را مشاهده می‌کنید:

class circle:
   def draw(self):
      print ("Draw a circle")
      return

class rectangle:
   def draw(self):
      print ("Draw a rectangle")
      return

class area:
   def area(self):
      print ("calculate area")
      return

def duck_function(obj):
   obj.draw()

objects = [circle(), rectangle(), area()]
for obj in objects:
   duck_function(obj)

کد بالا خروجی زیر را تولید می‌کند:

Draw a circle
Draw a rectangle
Traceback (most recent call last):
 File "C:\Python311\hello.py", line 21, in <module>
  duck_function(obj)
 File "C:\Python311\hello.py", line 17, in duck_function
 obj.draw()
AttributeError: 'area' object has no attribute 'draw'

مهم‌ترین ایده در تایپ‌دهی اردکی این است که تابع duck_function() به نوع مشخص اشیایی که دریافت می‌کند اهمیتی نمی‌دهد. این تابع فقط به اشیایی نیاز دارد که متد draw() را داشته باشند. اگر شیئی با داشتن رفتار موردنیاز، «مثل اردک صدا دربیاورد»، برای فراخوانی متد draw() با آن مانند یک «اردک» رفتار می‌شود.

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

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