tgoop.com/pyHints/328
Create:
Last Update:
Last Update:
Dynamic Protocol
هم از همین مفهموم استفاده میکنه؛ اگر یادتون باشه قبلا راجب پروتوکل مربوط به Sequence صحبت کردیم و گفتیم که اگر یک
class متدهای __len__, __getitem__رو داشته باشه میتونیم بعنوان
Sequence Protocol رو رعایت میکنه و پایتون میتونه مثل Sequence باهاش رفتار کنه و برخی از فانکشنالیتیهایی که پیاده سازی هم نکردیم رو بهش بده.Dynamic Protocol
ی قدم جلوتر میره و میگه اگر قرار نیست
len اون آبجکت رو بگیری پس نیازی نیست توی اون کلاس حتی __len__ رو پیاده سازی کنی و صرف وجود __getitem__ من بهت یک سری ویژگیهای Sequence رو میدم؛ ویژگیهایی که فقط به __getitem__ نیاز داره و نه چیز دیگه.توی مثال تصویر قبل؛ من هیچوقت
__iter__ رو پیادهسازی نکردم اما میتونم روی dp از for loop استفاده کنم؛ به لطف Duck typing, Dynamic Protocolپایتون از
__getitem__ استفاده میکنه و با شروع از اندیس 0 میتونه کار __iter__ رو انجام بده و for loop بهمون خروجی خواهد داد.برای
in هم موضوع همین هست؛ توی کد قبلی من هیچوقت __contain__ رو پیادهسازی نکردم اما 9 in dpخروجی میده (اینبار هم پایتون از
__getitem__ بعنوان fallback برای __contain__ استفاده میکنه)بحثی که پیش میاد اینه که؛ آیا این موضوع اتفاق خوبی هست ؟
نه همیشه؛ خیلی وقتها میشه نسخه
optimize شده تری رو نوشت مثلاْ توی کد قبلی اگر من لیست رو بصورت sort قرار باشه داشته باشم همیشه میتونم بجای __contain__ که خود پایتون بهم میده و linear search هست که مرتبه زمانی O(n) داره از Binary Search استفاده کنم و مرتبه زمانی رو تا O(log n) کاهش بدم.اما تا وقتی نیازی به بهبود ندارم؛ هیچوقت
__contain__ یا ... رو خودم پیادهسازی نمیکنم و از آنچه که پایتون بهم ارائه میده استفاده میکنم (اینطوری نه نیاز به تست هست؛ نه باگ ازش در میاد و کد تمیزتری هم خواهم داشت)BY Python Hints

Share with your friend now:
tgoop.com/pyHints/328
