Duck Typing in Python
از انجایی که پایتون داینامیک تایپ هست پس مفهوم داک تاپینیگ هم براش معنا پیدا میکنه. سیستم داک تایپینگ بر اساس اینترفیس و رفتار های ابجکت ها هست. خیلی از کلاس ها و ابزار های از موجود در پایتون از این سیستم پشتیبانی میکنند و این باعث انعطاف زیاد در کد میشه که در ادامه توضیح میدیم.
تعاریف زیادی در خصوص داک تایپینگ وجود داره، اما تعریف اصلی بر اساس این جمله معروف هست : "اگر مثل داک ( به فارسی : اردک) راه میره و مثل داک، کواک ( صدای اردک 😀) میکنه پس قطعا یک اردک است."
اگر بخواهیم این رو به برنامه نویسی تعمیم دهیم، شما میتونید چند ابجکت داشته باشید که صدای اردک در بیارن و مثل اردک راه برن و نیازی به چک کردن تایپشون که ایا اردک هستند، نباشه. داک تایپینگ یک تایپ سیستم هست که در اون، یک ابجکت میتونه سازگار با یک تایپ معین در نظر گرفته بشه اگر تمام متد ها و اتریبیوت های مورد نیاز اون تایپ رو داشته باشه. این تایپ سیستم در واقع از استفاده کردن چند ابجکت که هر کدوم از کلاس متفاوت و مستقلی هستند، در یک مفهوم خاص پشتیبانی میکنه. این امر تا زمانی ممکن هست که این کلاس ها به یک اینترفیس مشترک پایبند باشند. اگر کامل متوجه نشدید نگران نباشید با مثالی که میزنیم کاملا متوجه موضوع میشید :).
در قطعه کد زیر چند پرنده داریم که توانایی پرواز و شنا کردن رو دارند.
در این مثال سه پرنده ما میتونند هم پروار و هم شنا کنند اگرچه که هر کدوم یک کلاس جدا و مستقل از هم دیگه هستند. به دلیل اینکه هر سه کلاس ما اینترفیس مشترکی رو اراعه میدهند میتوانیم بدین صورت در کد از انها استفاده کنیم.
پایتون اهمیتی نمیده که وریبل پرنده )bird( دقیقا چه ابجکتی رو درون خودش داره و فقط متدی که بهش گفته شده رو اجرا میکنه.
اگر ابجکت ما متد مورد نظر رو داشته باشه، کد بدون مشکل اجرا میشه و این همون بحث انطعاف پذیری داک تایپینگ هست.
این بحث داک تایپینگ تو ابزار های built-in پایتون هم پیاده سازی و پشتیبانی میشه
که تو عکس1 در بخش کامنت ها میتونید ببینید.
نقاط قوت و ضعف داک تایپینگ
داک تایپینگ انعطاف پذیری زیادی رو به شما به عنوان برنامه نویس پیشنهاد میده و دلیل اصلیشم این هست نیازی به فکر کردن راجع به مفاهیم پیچیده ای مثل ارث بری و روابط بین کلاس ها، نیست.
نکات مثبت ان:
• انعطاف پذیری : میتوانید از ابجکت های مختلف بر اساس رفتار های انها بدون نگرانی درمورد تایپ انها به جای یکدیگر استفاده کنید. این ماژولار بودن و توسعه پذیری کد شما را بالا میبرد.
• سادگی : شما میتونید با تمرکز بر روی رفتار های مورد نیاز بجای تمرکز روی تایپ های خاص و کلاس ها و روابط بین انها، کدتون رو ساده کنید. این به شما اجازه میده که کد مختصر تر و رسا تری داشته باشید.
• استفاده مجدد از کد : شما میتونید از یک یا چند کلاس در یک اپ دیگر به طور مجدد استفاده کنید بدون انکه مجبور باشید سلسله مراتبی از کلاس هارو اکسپورت کنید تا کلاس مورد نظرتون کار بکنه.
خب همونطور که میدونید هیچ چیزی بی عیب و نقص نیست و داک تایپینگ هم از این قاعده مستثنی نیست.
نکات منفی ان :
• رانتایم ارور های احتمالی : شما ممکنه به یک سری ارور مرتبط با وجود نداشتن یک متد یا اتریبیوت مواجه بشید که فقط در صورت ران کردن کد متوجه این خطا خواهید شد و این منجر به رفتار غیر منتظره یا کرش کردن برنامه شما میشه.
• مشکلات نگهداری : ممکن است در دنبال کردن ابجکت هایی که باید رفتار خاضی از خود نشان بدهند دچار مشکل شوید. تغییرات در رفتار بعضی ابجکت های خاص ممکن است روی قسمت دیگری از کد تاثیر بگذارد و نگهداری کد و دیباگ کردن ان دچار مشکل شود.
#duck_typing
#type_system
#reall_python
@code_crafters
از انجایی که پایتون داینامیک تایپ هست پس مفهوم داک تاپینیگ هم براش معنا پیدا میکنه. سیستم داک تایپینگ بر اساس اینترفیس و رفتار های ابجکت ها هست. خیلی از کلاس ها و ابزار های از موجود در پایتون از این سیستم پشتیبانی میکنند و این باعث انعطاف زیاد در کد میشه که در ادامه توضیح میدیم.
تعاریف زیادی در خصوص داک تایپینگ وجود داره، اما تعریف اصلی بر اساس این جمله معروف هست : "اگر مثل داک ( به فارسی : اردک) راه میره و مثل داک، کواک ( صدای اردک 😀) میکنه پس قطعا یک اردک است."
اگر بخواهیم این رو به برنامه نویسی تعمیم دهیم، شما میتونید چند ابجکت داشته باشید که صدای اردک در بیارن و مثل اردک راه برن و نیازی به چک کردن تایپشون که ایا اردک هستند، نباشه. داک تایپینگ یک تایپ سیستم هست که در اون، یک ابجکت میتونه سازگار با یک تایپ معین در نظر گرفته بشه اگر تمام متد ها و اتریبیوت های مورد نیاز اون تایپ رو داشته باشه. این تایپ سیستم در واقع از استفاده کردن چند ابجکت که هر کدوم از کلاس متفاوت و مستقلی هستند، در یک مفهوم خاص پشتیبانی میکنه. این امر تا زمانی ممکن هست که این کلاس ها به یک اینترفیس مشترک پایبند باشند. اگر کامل متوجه نشدید نگران نباشید با مثالی که میزنیم کاملا متوجه موضوع میشید :).
در قطعه کد زیر چند پرنده داریم که توانایی پرواز و شنا کردن رو دارند.
--------------
birds_v1.py
--------------
class Duck:
def swim(self):
print("The duck is swimming")
def fly(self):
print("The duck is flying")
class Swan:
def swim(self):
print("The swan is swimming")
def fly(self):
print("The swan is flying")
class Albatross:
def swim(self):
print("The albatross is swimming")
def fly(self):
print("The albatross is flying")
در این مثال سه پرنده ما میتونند هم پروار و هم شنا کنند اگرچه که هر کدوم یک کلاس جدا و مستقل از هم دیگه هستند. به دلیل اینکه هر سه کلاس ما اینترفیس مشترکی رو اراعه میدهند میتوانیم بدین صورت در کد از انها استفاده کنیم.
>>> from birds_v1 import Duck, Swan, Albatross
>>> birds = [Duck(), Swan(), Albatross()]
>>> for bird in birds:
... bird.fly()
... bird.swim()
...
The duck is flying
The duck is swimming
The swan is flying
The swan is swimming
The albatross is flying
The albatross is swimming
پایتون اهمیتی نمیده که وریبل پرنده )bird( دقیقا چه ابجکتی رو درون خودش داره و فقط متدی که بهش گفته شده رو اجرا میکنه.
اگر ابجکت ما متد مورد نظر رو داشته باشه، کد بدون مشکل اجرا میشه و این همون بحث انطعاف پذیری داک تایپینگ هست.
این بحث داک تایپینگ تو ابزار های built-in پایتون هم پیاده سازی و پشتیبانی میشه
که تو عکس1 در بخش کامنت ها میتونید ببینید.
نقاط قوت و ضعف داک تایپینگ
داک تایپینگ انعطاف پذیری زیادی رو به شما به عنوان برنامه نویس پیشنهاد میده و دلیل اصلیشم این هست نیازی به فکر کردن راجع به مفاهیم پیچیده ای مثل ارث بری و روابط بین کلاس ها، نیست.
نکات مثبت ان:
• انعطاف پذیری : میتوانید از ابجکت های مختلف بر اساس رفتار های انها بدون نگرانی درمورد تایپ انها به جای یکدیگر استفاده کنید. این ماژولار بودن و توسعه پذیری کد شما را بالا میبرد.
• سادگی : شما میتونید با تمرکز بر روی رفتار های مورد نیاز بجای تمرکز روی تایپ های خاص و کلاس ها و روابط بین انها، کدتون رو ساده کنید. این به شما اجازه میده که کد مختصر تر و رسا تری داشته باشید.
• استفاده مجدد از کد : شما میتونید از یک یا چند کلاس در یک اپ دیگر به طور مجدد استفاده کنید بدون انکه مجبور باشید سلسله مراتبی از کلاس هارو اکسپورت کنید تا کلاس مورد نظرتون کار بکنه.
خب همونطور که میدونید هیچ چیزی بی عیب و نقص نیست و داک تایپینگ هم از این قاعده مستثنی نیست.
نکات منفی ان :
• رانتایم ارور های احتمالی : شما ممکنه به یک سری ارور مرتبط با وجود نداشتن یک متد یا اتریبیوت مواجه بشید که فقط در صورت ران کردن کد متوجه این خطا خواهید شد و این منجر به رفتار غیر منتظره یا کرش کردن برنامه شما میشه.
• مشکلات نگهداری : ممکن است در دنبال کردن ابجکت هایی که باید رفتار خاضی از خود نشان بدهند دچار مشکل شوید. تغییرات در رفتار بعضی ابجکت های خاص ممکن است روی قسمت دیگری از کد تاثیر بگذارد و نگهداری کد و دیباگ کردن ان دچار مشکل شود.
#duck_typing
#type_system
#reall_python
@code_crafters
👍5❤1👌1
حالا اگر بخواید تو کلاس کاستوم خودتون داک تایپینگ رو پیاده سازی کنید دو روش وجود داره
1. Regular methods
که دقیقا همون مثال پرنده ای که زدیم در بالا از همین روش استفاده شده ولی اگر بخوایم یک مثال کاربردی تر بزنیم میتونیم فرض کنیم میخوایم چند کلاس بسازیم واسه خواندن انواع فایل های csv, json, txt خب میایم سه تا کلاس میسازیم و واسه هر کدوم یک متد با نام مشابه برای خواندن فایل و یک اتریبیوت با نام مشابه نیز میسازیم، اینطوری یک اینترفیس یکسان و مشترک برای کلاس های مختلف با ساز و کار مختلف داریم. به راحتی میتونیم چند ابجکت مختلف از این کلاس ها بسازیم و با یک حلقه فور میتونیم از متد خواندن استفاده کنیم.
2. Special methods
اسپشیال متد ها یا همون داندر متد ها، با دوتا اندراسکور در اول و اخر نامشون مشخص میشوند و معنای خاصی برای پایتون دارند.
بیاید فرض کنیم میخوایم یک صف )queue( درست کنیم
و میخوایم که صف ما iterable باشه و همچنین بتونیم از
Len, reversed , in استفاده کنیم
خب کد ما به به این شکل خواهد شد :
خب تو این کلاس ما دوتا عملیات کلاسیک اضافه کردن به صف و حذف کردن از صف رو داریم و همچنین چند داندر متد برای کلاس پیاده سازی کردیم تا عملیات های مورد نیاز مارو پشتیبانی کنه.
منبع
#duck_typing
#type_system
#reall_python
@code_crafters
1. Regular methods
که دقیقا همون مثال پرنده ای که زدیم در بالا از همین روش استفاده شده ولی اگر بخوایم یک مثال کاربردی تر بزنیم میتونیم فرض کنیم میخوایم چند کلاس بسازیم واسه خواندن انواع فایل های csv, json, txt خب میایم سه تا کلاس میسازیم و واسه هر کدوم یک متد با نام مشابه برای خواندن فایل و یک اتریبیوت با نام مشابه نیز میسازیم، اینطوری یک اینترفیس یکسان و مشترک برای کلاس های مختلف با ساز و کار مختلف داریم. به راحتی میتونیم چند ابجکت مختلف از این کلاس ها بسازیم و با یک حلقه فور میتونیم از متد خواندن استفاده کنیم.
2. Special methods
اسپشیال متد ها یا همون داندر متد ها، با دوتا اندراسکور در اول و اخر نامشون مشخص میشوند و معنای خاصی برای پایتون دارند.
بیاید فرض کنیم میخوایم یک صف )queue( درست کنیم
و میخوایم که صف ما iterable باشه و همچنین بتونیم از
Len, reversed , in استفاده کنیم
خب کد ما به به این شکل خواهد شد :
from collections import deque
class Queue:
def __init__(self):
self._elements = deque()
def enqueue(self, element):
self._elements.append(element)
def dequeue(self):
return self._elements.popleft()
def __iter__(self):
return iter(self._elements)
def __len__(self):
return len(self._elements)
def __reversed__(self):
return reversed(self._elements)
def __contains__(self, element):
return element in self._elements
خب تو این کلاس ما دوتا عملیات کلاسیک اضافه کردن به صف و حذف کردن از صف رو داریم و همچنین چند داندر متد برای کلاس پیاده سازی کردیم تا عملیات های مورد نیاز مارو پشتیبانی کنه.
>>> from queues import Queueمیبینید که تمام عملیات های مورد نیاز مارو به خوبی انجام میده.
>>> queue = Queue()
>>> queue.enqueue(1)
>>> queue.enqueue(2)
>>> queue.enqueue(3)
>>> [item for item in queue]
[1, 2, 3]
>>> len(queue)
3
>>> list(reversed(queue))
[3, 2, 1]
>>> 2 in queue
True
>>> 6 in queue
False
منبع
#duck_typing
#type_system
#reall_python
@code_crafters
👍4💋2❤1