أساسيات الوراثة

13.1 أساسيات الوراثة

أهداف التعلم

في نهاية هذا القسم، ينبغي أن تكون قادرًا على

  • تحديد العلاقات من نوع "هو-أ" و "يحتوي-على" بين الأصناف.
  • التمييز بين الصنف الفرعي (subclass) والصنف الأساسي (superclass).
  • إنشاء صنف أساسي، وصنف فرعي، ومثيلات (instances) من كل منهما.

علاقات "هو-أ" مقابل "يحتوي-على"

ترتبط الأصناف ببعضها. توجد علاقة "هو-أ" بين الصنف الفرعي والصنف الأساسي. مثال: النرجس هو نبات. يرث الصنف Daffodil من الصنف الأساسي Plant.

يمكن الخلط بين علاقات "هو-أ" وعلاقات "يحتوي-على". توجد علاقة "يحتوي-على" بين صنف يحتوي على صنف آخر. مثال: الموظف لديه حاسوب محمول صادر عن الشركة. ملاحظة: الحاسوب المحمول ليس موظفًا.

نقطة تحقق

علاقة "هو-أ" بين Employee و Developer

مفاهيم تطبيقية

العلاقات بين الأصناف

1.
ما العلاقة بين الصنف Doughnut والصنف Pastry؟
  1. هو-أ
  2. يحتوي-على
2.
ما العلاقة بين الصنف Kitchen والصنف Freezer؟
  1. هو-أ
  2. يحتوي-على
3.
حارس المرمى هو لاعب. حارس المرمى هو صنف _______. اللاعب هو صنف _______
  1. أساسي؛ فرعي
  2. فرعي؛ أساسي

الوراثة في بايثون

تستخدم الوراثة (inheritance) علاقة "هو-أ" لوراثة صنف من صنف أساسي. يرث الصنف الفرعي جميع سمات (attributes) وتوابع (methods) الصنف الأساسي، ويوسع وظائف الصنف الأساسي.

في بايثون، يُنشأ الصنف الفرعي بتضمين اسم الصنف الأساسي بين قوسين في بداية تعريف الصنف الفرعي:

    class SuperClass:
        # سمات وتوابع الصنف الأساسي
    
    class SubClass(SuperClass):
        # سمات وتوابع الصنف الفرعي

نقطة تحقق

استخدام الوراثة لإنشاء أصناف فرعية

مفاهيم تطبيقية

إنشاء أصناف فرعية

4.
كيف يُعرَّف الصنف Daisy الذي يرث من الصنف Plant؟
  1. class Plant(Daisy):
  2. class Daisy(Plant):
  3. class Daisy:
    class Plant:
    
5.
افترض أن الصنف CarryOn موروث من الصنف Luggage. كيف يُنشأ مثيل من CarryOn؟
  1. small_bag = CarryOn()
  2. small_bag = Luggage(CarryOn)
  3. small_bag = CarryOn(Luggage)
6.
بالاستناد إلى الصنف الأساسي SuperClass والصنف الفرعي SubClass التاليين، أي مما يلي يمكن لمثيل من SubClass الوصول إليه؟
class SuperClass():
  def func_1(self):
    print('Superclass function')

class SubClass(SuperClass):
  def func_2(self):
    print('Subclass function')
  1. func_1() فقط
  2. func_2() فقط
  3. func_1() و func_2()
7.
بالاستناد إلى الصنف الأساسي SuperClass والصنف الفرعي SubClass التاليين، أي مما يلي يمكن لمثيل من SuperClass الوصول إليه؟
class SuperClass():
  def func_1(self):
    print('Superclass function')

class SubClass(SuperClass):
  def func_2(self):
    print('Subclass function')
  1. func_1() فقط
  2. func_2() فقط
  3. func_1() و func_2()

مصطلحات الوراثة البديلة

تستخدم وثائق بايثون الخاصة بالوراثة مصطلحات متعددة للإشارة إلى الصنف الموروث منه والصنف الذي يرث. يستخدم هذا الكتاب مصطلحي الصنف الأساسي/الفرعي (superclass/subclass) في جميع أنحائه لتحقيق الاتساق.

الصنف الموروث منه الصنف الذي يرث
الصنف الأساسي (superclass) الصنف الفرعي (subclass)
الصنف الأساسي (base class) الصنف المشتق (derived class)
الصنف الأب (parent class) الصنف الابن (child class)
جدول 13.1

جرّب بنفسك

صنفا Employee و Developer

أنشئ صنفَ Developer يرث من الصنف Employee المعطى. يمتلك الصنف Developer تابعًا واحدًا هو update_codebase()، يطبع "Employee has updated the codebase". ثم استخدم مثيل Developer المُسمَّى python_dev لاستدعاء print_company() و update_codebase().

جرّب بنفسك

أصناف المضلعات

عرّف ثلاثة أصناف: Polygon، و Rectangle، و Square:

  • يمتلك الصنف Polygon التابعَ p_disp() الذي يطبع "object is a Polygon".
  • يرث الصنف Rectangle من Polygon ويمتلك التابعَ r_disp() الذي يطبع "object is a Rectangle".
  • يرث الصنف Square من Rectangle ويمتلك التابعَ s_disp() الذي يطبع "object is a Square".

أنشئ مثيلاً من كل صنف، ثم نادِ لكل مثيل جميعَ التوابع التي تستطيع الوصول إليها.