آموزش Real Python به نقش Protocol در type hints پایتون میپردازد: راهی برای مشخصکردن methodها و attributeهایی که یک class باید داشته باشد تا با یک type سازگار شناخته شود. نکتهٔ اصلی این است که این سازگاری میتواند بر پایهٔ ساختار class باشد، بدون آنکه رابطهای از طریق inheritance برقرار شده باشد.
متن ابتدا دو کاربرد متفاوت واژهٔ Protocol در Python را روشن میکند. کاربرد قدیمیتر به قراردادهای داخلی مانند iterator، context manager و descriptor اشاره دارد؛ برای نمونه، methodهای __iter__() و __next__() قرارداد iterator را تعریف میکنند. کاربرد دوم که در Python 3.8 معرفی شد، به تعریف ساختاری اشاره دارد که classهای مختلف با داشتن methodها و attributeهای موردنیاز آن، میتوانند جای یکدیگر استفاده شوند.
این موضوع با duck typing ارتباط مستقیم دارد. در duck typing، نام type یا جایگاه class در inheritance ملاک اصلی نیست؛ مهم این است که object قابلیتهای لازم را داشته باشد. نمونهٔ متن، پیمایش روی list، tuple، string، dictionary و set است: با وجود تفاوت این typeها، همگی از iteration پشتیبانی میکنند.
Protocol این نگاه را به static type checking پیوند میدهد. طبق توضیح مقاله، ابزارهایی مانند mypy، Pyright و Pyre پیش از پشتیبانی از Protocol، برای بررسی رابطهٔ typeها به nominal subtyping مبتنی بر inheritance متکی بودند. structural subtyping این امکان را فراهم میکند که ساختار class بررسی شود؛ قابلیتی که متن از آن با عنوان static duck typing نیز یاد میکند.
آموزش کامل همچنین ساخت Protocol سفارشی با classِ Protocol و تفاوت آن با abstract base classes را در برنامهٔ خود دارد، اما بخش ارائهشده هنوز وارد جزئیات این مباحث نمیشود. برای دنبالکردن توضیحات و مثالهای کامل، به مقالهٔ اصلی مراجعه کن: https://realpython.com/python-protocol/




