0Pricing
Python Academy · درس

الوراثة المتعددة وMRO

افهم الوراثة المتعددة وMRO في Python، أي الخطية C3

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

مقدمة

تدعم Python الوراثة المتعددة. ويحدد ترتيب تحليل الطريقة (MRO) الطريقة التي تُستدعى عند تعارض الأسماء.

صياغة الوراثة المتعددة

ترث class C(A, B): من كل من A وB. وتحصل C على جميع الطرق من كلتيهما.
class A:
    def hello(self): return 'A'
class B:
    def world(self): return 'B'
class C(A, B): pass
c = C()
print(c.hello(), c.world())

ترتيب تحليل الطريقة (MRO)

يحدد MRO ترتيب البحث. ويعرض C.__mro__ الترتيب: C, A, B, object. وتفوز أول فئة تحتوي على طريقة مطابقة.
class A:
    def greet(self): return 'A'
class B:
    def greet(self): return 'B'
class C(A, B): pass
print(C().greet())  # A wins
print(C.__mro__)

التسلسل الخطي C3

تستخدم Python التسلسل الخطي C3 لحساب MRO. وهو يضمن ظهور الفئة الابنة قبل الفئة الأب، واتباع الترتيب من اليسار إلى اليمين للفئات الأساسية المتعددة.
class A: pass
class B(A): pass
class C(A): pass
class D(B, C): pass
print([c.__name__ for c in D.__mro__])

الوراثة الماسية

تمثل D(B,C)، حيث ترث B وC كلتاهما من A، مشكلة الوراثة الماسية. ويضمن C3 استدعاء __init__ الخاصة بـ A مرة واحدة فقط.
class A:
    def __init__(self): print('A')
class B(A):
    def __init__(self): super().__init__(); print('B')
class C(A):
    def __init__(self): super().__init__(); print('C')
class D(B, C):
    def __init__(self): super().__init__(); print('D')
D()

Mixins

إن mixin فئة مصممة للوراثة المتعددة. وهي تضيف طرقًا دون أن تعمل بمفردها بوصفها فئة كاملة.
class JSONMixin:
    def to_json(self):
        import json
        return json.dumps(vars(self))
class User(JSONMixin):
    def __init__(self, name, age): self.name,self.age=name,age
print(User('Alice', 30).to_json())

قواعد تصميم Mixins

ينبغي أن تكون Mixins: بلا __init__، وألا ترث من فئات ليست Mixins، وأن تؤدي مهمة واحدة. وسمِّها بلاحقة Mixin.
class LoggingMixin:
    def log(self, msg): print(f'[{self.__class__.__name__}] {msg}')
class Service(LoggingMixin):
    def run(self): self.log('running')
Service().run()

super() في الوراثة المتعددة

يستدعي super() الفئة التالية في MRO، وليس بالضرورة الفئة الأب المباشرة. ويجب على كل فئة استدعاء super() لتحقيق السلوك التعاوني.
class Base:
    def action(self): return 'Base'
class A(Base):
    def action(self): return 'A->' + super().action()
class B(Base):
    def action(self): return 'B->' + super().action()
class C(A, B):
    def action(self): return 'C->' + super().action()
print(C().action())

type() لإنشاء الفئات ديناميكيًا

ينشئ type('NewClass', (Base,), {'method': fn}) فئةً ديناميكيًا. وهذا مفيد في البرمجة الوصفية.
def hello(self): return 'hello'
MyClass = type('MyClass', (object,), {'hello': hello})
print(MyClass().hello())

التحقق من MRO

يعرض ClassName.__mro__ أو inspect.getmro(ClassName) ترتيب التحليل على هيئة صف من الفئات.
class A: pass
class B(A): pass
class C(B): pass
import inspect
print([c.__name__ for c in inspect.getmro(C)])

متى يجب تجنّب الوراثة المتعددة

يصعب فهم التسلسلات الهرمية المعقدة للوراثة المتعددة. وفّضّل التركيب أو Mixins البسيطة على التسلسلات الهرمية العميقة.
# Prefer:
class User:
    def __init__(self, name, logger):
        self.name = name
        self.logger = logger  # composition
print('composition preferred')

تحقق سريع

ما الخوارزمية التي تستخدمها Python لحساب ترتيب حلّ الأساليب؟

مراجعة

الوراثة المتعددة: ‎class C(A, B)‎. يُحدَّد ترتيب حلّ الأساليب عبر خطية C3، وهي التي تحدد آلية البحث عن الأساليب. استخدم mixins للحفاظ على نظافة الوراثة المتعددة. تتبع ‎super()‎ ترتيب حلّ الأساليب.

واصل التقدم

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

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

هل درس «الوراثة المتعددة وMRO» مجاني؟

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

ماذا ستتعلم في «الوراثة المتعددة وMRO»؟

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

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

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

كم من الوقت يستغرق درس «الوراثة المتعددة وMRO»؟

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

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

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

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

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