لقد تم الإشادة منذ فترة طويلة بالطبيعة الديناميكية لـ Python ودعمها لكتابة البطة لمرونتها. ومع ذلك، مع نمو قواعد التعليمات البرمجية بشكل أكبر وأكثر تعقيدًا، أصبحت فوائد التحقق من النوع الثابت واضحة بشكل متزايد. ولكن كيف يمكننا التوفيق بين مرونة كتابة البطة وسلامة التحقق من النوع الثابت؟ أدخل فئة بروتوكول بايثون.
في هذا البرنامج التعليمي، ستتعلم:
كتابة البطة هي مفهوم برمجة حيث يكون نوع أو فئة الكائن أقل أهمية من الأساليب التي يحددها. إنها مبنية على فكرة أنه "إذا كانت تبدو مثل البطة، وتسبح مثل البطة، وتصدر صوتًا مثل البطة، فمن المحتمل أنها بطة."
في بايثون، كتابة البطة مدعومة بالكامل. على سبيل المثال:
class Duck: def quack(self): print("Quack!") class Person: def quack(self): print("I'm imitating a duck!") def make_it_quack(thing): # Note: No type hint here thing.quack() duck = Duck() person = Person() make_it_quack(duck) # Output: Quack! make_it_quack(person) # Output: I'm imitating a duck!
في هذا المثال، لا يهتم make_it_quack بنوع الشيء. يهمه فقط أن هذا الشيء لديه طريقة الدجال. لاحظ أنه لا يوجد تلميح للنوع لمعلمة thing، وهو أمر نموذجي في التعليمات البرمجية المكتوبة على شكل بطة ولكنه قد يؤدي إلى مشكلات في قواعد التعليمات البرمجية الأكبر.
توفر كتابة البطة العديد من المزايا:
ولكن له أيضًا بعض العيوب:
أحد الأساليب لمعالجة هذه المشكلات هو استخدام الفئات الأساسية المجردة (ABCs). إليك مثال:
from abc import ABC, abstractmethod class Quacker(ABC): @abstractmethod def quack(self): pass class Duck(Quacker): def quack(self): print("Quack!") class Person(Quacker): def quack(self): print("I'm imitating a duck!") def make_it_quack(thing: Quacker): thing.quack() duck = Duck() person = Person() make_it_quack(duck) make_it_quack(person)
على الرغم من أن هذا الأسلوب يوفر فحصًا أفضل للنوع وواجهات أكثر وضوحًا، إلا أنه له عيوب:
قدم بايثون 3.8 فئة البروتوكول، والتي تسمح لنا بتعريف الواجهات دون الحاجة إلى الميراث. وإليك كيف يمكننا استخدامه:
from typing import Protocol class Quacker(Protocol): def quack(self):... class Duck: def quack(self): print("Quack!") class Person: def quack(self): print("I'm imitating a duck!") def make_it_quack(thing: Quacker): thing.quack() duck = Duck() person = Person() make_it_quack(duck) make_it_quack(person)
دعونا نقسم هذا:
يمنحنا هذا النهج العديد من الفوائد:
إليك مثال أكثر تعقيدًا يوضح كيف يمكن أن تكون البروتوكولات معقدة حسب الحاجة (الشكل)، مع الحفاظ على فئات المجال الخاص بك (دائرة، مستطيل) مسطحة:
from typing import Protocol, List class Drawable(Protocol): def draw(self): ... class Resizable(Protocol): def resize(self, factor: float): ... class Shape(Drawable, Resizable, Protocol): pass def process_shapes(shapes: List[Shape]): for shape in shapes: shape.draw() shape.resize(2.0) # Example usage class Circle: def draw(self): print("Drawing a circle") def resize(self, factor: float): print(f"Resizing circle by factor {factor}") class Rectangle: def draw(self): print("Drawing a rectangle") def resize(self, factor: float): print(f"Resizing rectangle by factor {factor}") # This works with any class that has draw and resize methods, # regardless of its actual type or inheritance shapes: List[Shape] = [Circle(), Rectangle()] process_shapes(shapes)
في هذا المثال، لا ترث الدائرة والمستطيل من الشكل أو أي فئة أخرى. إنهم ببساطة ينفذون الأساليب المطلوبة (الرسم وتغيير الحجم). يمكن أن تعمل الدالةprocess_shapes مع أي كائنات تحتوي على هذه الطرق، وذلك بفضل بروتوكول الشكل.
توفر البروتوكولات في Python طريقة قوية لجلب الكتابة الثابتة إلى التعليمات البرمجية المكتوبة على شكل بطة. إنها تسمح لنا بتحديد الواجهات في نظام الكتابة دون الحاجة إلى الوراثة، والحفاظ على مرونة الكتابة البطية مع إضافة فوائد التحقق من النوع الثابت،
باستخدام البروتوكولات، يمكنك:
إذا كنت تريد معرفة المزيد حول البروتوكولات وتلميحات الكتابة في Python، فراجع وثائق Python الرسمية في وحدة الكتابة، أو استكشف أدوات التحقق من النوع الثابت المتقدمة مثل mypy.
سعيد في البرمجة، وأتمنى أن يكون بطك دائمًا مجتهدًا في مجال سلامة الكتابة!
يمكنك العثور على المزيد من المحتوى الخاص بي، بما في ذلك رسالتي الإخبارية هنا
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3