tgoop.com/pythonlearnme/161
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 🧑💻PythonDev🧑💻

Share with your friend now:
tgoop.com/pythonlearnme/161