0Pricing
Python Academy · درس

تعدد الأشكال والكتابة بأسلوب البطة

اكتب شيفرة متعددة الأشكال تعمل مع أي كائن متوافق

تعدد الأشكال والكتابة بأسلوب البطة درس مجاني في Python Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Python Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Python Academy 4 دروس في المجموع.

مقدمة

يتيح تعدد الأشكال للكائنات المختلفة الاستجابة للواجهة نفسها. وتعني Duck Typing ما يلي: إذا كان الكائن يتصرف مثل البطة، فهو بطة.

ما تعدد الأشكال؟

يعني تعدد الأشكال «أشكالًا متعددة». إذ يعمل اسم الأسلوب نفسه بطرق مختلفة مع كائنات مختلفة. وتتبنى Python هذا النهج على نطاق واسع.
class Cat:
    def speak(self): return 'Meow'
class Dog:
    def speak(self): return 'Woof'
for animal in [Cat(), Dog()]:
    print(animal.speak())

Duck Typing

لا تتطلب Python تسلسلًا هرميًا للفئات لتحقيق تعدد الأشكال. فإذا كان الكائن يوفّر الأسلوب المطلوب، فإنه يعمل. ولا حاجة إلى الواجهات.
class Duck:
    def quack(self): return 'Quack'
class Person:
    def quack(self): return 'I am quacking like a duck'
def make_it_quack(duck):
    print(duck.quack())
make_it_quack(Duck())
make_it_quack(Person())

الدوال متعددة الأشكال

تعمل ‎len()‎ مع السلاسل والقوائم والقواميس والصفوف — لأن جميعها تنفذ ‎__len__‎. وهذا مثال على تعدد الأشكال المضمّن.
for obj in ['hello', [1,2,3], {'a':1}]:
    print(type(obj).__name__, len(obj))

التحميل الزائد للعوامل

يعمل العامل ‎+‎ مع الأعداد الصحيحة والعشرية والسلاسل والقوائم، لأن كل نوع منها ينفذ ‎__add__‎ بطريقة مختلفة.
print(1 + 2)        # int addition
print('a' + 'b')    # string concat
print([1] + [2])    # list concat

Duck Typing القائم على البروتوكول

بروتوكول التكرار: يعمل أي كائن يوفّر ‎__iter__‎ و‎__next__‎ داخل حلقات ‎for‎، من دون الحاجة إلى فئة أساسية.
class Squares:
    def __init__(self, n): self.n,self.i=n,0
    def __iter__(self): return self
    def __next__(self):
        if self.i>=self.n: raise StopIteration
        x=self.i**2; self.i+=1; return x
print(list(Squares(5)))

EAFP مقابل LBYL

يستخدم EAFP ‏(Easier to Ask Forgiveness than Permission)‏ ‎try/except‎. أما LBYL ‏(Look Before You Leap)‏ فيستخدم ‎if/hasattr‎. وتفضّل Python أسلوب EAFP.
# LBYL:
if hasattr(obj, 'quack'):
    obj.quack()
# EAFP (Pythonic):
try:
    'hello'.quack()
except AttributeError:
    print('no quack')

‎isinstance()‎ للتوزيع الآمن

عندما تحتاج إلى سلوك خاص بنوع معين، يكون استخدام ‎isinstance()‎ أوضح من التقاط ‎AttributeError‎.
def process(data):
    if isinstance(data, str):
        return data.upper()
    elif isinstance(data, list):
        return [x*2 for x in data]
print(process('hi'))
print(process([1,2,3]))

الفئات الأساسية المجردة كبروتوكولات

يعرّف ‎from abc import ABC, abstractmethod‎ بروتوكولات رسمية. ويجب على الفئات الفرعية تنفيذ الأساليب المجردة.
from abc import ABC, abstractmethod
class Drawable(ABC):
    @abstractmethod
    def draw(self): pass
class Circle(Drawable):
    def draw(self): print('O')
Circle().draw()

‎typing.Protocol‎ ‏(3.8 فأحدث)

يعرّف ‎class MyProtocol(Protocol):‎ التوريث البنيوي للأنواع من دون استخدام ABC. وهو يعمل مع mypy لإجراء الفحوصات الساكنة.
from typing import Protocol
class Quackable(Protocol):
    def quack(self) -> str: ...
def make_quack(x: Quackable) -> str:
    return x.quack()
print('protocol demo')

تعدد الأشكال عمليًا

صمّم واجهات برمجية تقبل أي كائن يوفّر الواجهة المطلوبة. ويجعل ذلك شيفرتك قابلة للتوسعة من دون تعديلها.
class JSONSerializer:
    def serialize(self, obj): import json; return json.dumps(obj)
class XMLSerializer:
    def serialize(self, obj): return f'<data>{obj}</data>'
def export(data, serializer):
    return serializer.serialize(data)
print(export({'x': 1}, JSONSerializer()))

تحقق سريع

ماذا تعني Duck Typing في Python؟

مراجعة

تعدد الأشكال: الواجهة نفسها، وسلوك مختلف. وDuck Typing: السلوك مهم، لا النوع. وتعرّف البروتوكولات الواجهات بصورة غير رسمية. ويُعد EAFP ‏(try/except) أسلوبًا مميزًا في Python.

واصل التقدم

تقدم ممتاز! واصل التقدم لإتقان المفهوم التالي.

الأسئلة الشائعة

هل درس «تعدد الأشكال والكتابة بأسلوب البطة» مجاني؟

نعم — نص درس «تعدد الأشكال والكتابة بأسلوب البطة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Python Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Python Academy 4 دروس في المجموع.

ماذا ستتعلم في «تعدد الأشكال والكتابة بأسلوب البطة»؟

اكتب شيفرة متعددة الأشكال تعمل مع أي كائن متوافق تتمرن على Python Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Python Academy؟

لا تُشترط خبرة سابقة. Python Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «تعدد الأشكال والكتابة بأسلوب البطة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Python Academy هذا؟

نعم. كل درس في Python Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الوراثة الأحادية
  2. تجاوز الطرق وsuper()
  3. الوراثة المتعددة وMRO
  4. تعدد الأشكال والكتابة بأسلوب البطة
← العودة إلى Python Academy