الوراثة (Inheritance)

الوراثة

الوراثة (Inheritance) هي عمليَّة تخصيص بحيث يستمد الصنف خصائصه وطرائقه من الصنف الأعم.

  • يسمى العام: Super أو Base أو Parent
  • يسمى الخاص: Sub أو Extending أو Child

نمثل له ببساطة في الأشكال بالشجرة التالية:

نكتب اسم الصنف العام بين قوسين بعد اسم الصنف الخاص، مثل class Rectangle(Shape):.

الصنف المجرّد والطرائق المنفّذة

نعرف أن لكل شكل مساحة، لكن حسابها يختلف بين المستطيل والمثلث. أما المحيط فيمكن حسابه بجمع الأضلاع في الحالتين. نميّز لذلك بين:

  1. طريقة مجرّدة نلزم الصنف الخاص بتوفير تنفيذ لها، مثل حساب المساحة.
  2. طريقة منفّذة نكتب حسابها في الصنف العام، وترثها الأصناف الخاصة، مثل حساب المحيط.

نستعمل ABC وabstractmethod من وحدة abc لتعريف صنف أساس مجرّد (Abstract Base Class). يستطيع الصنف المجرّد الجمع بين الطرائق المجرّدة والمنفّذة.

تعريف صنف الشكل

نعرف الشكل بأن:

  • له أضلاع (sides)
  • له محيط (perimeter)
  • له مساحة (area)

تعريف صنف المستطيل

نعرف المستطيل بأن: له طولاً وعرضًا (width و height) هي الأضلاع (sides). وهذا يكون بالدالة الأساس super() بالإسناد إلى دالة الإنشاء فيها (__init__) على هذا النحو:

المربع

أما المربع، فهو صنفٌ خاص من المستطيل:

المثلث

وأما المثلث، فهو من الشكل:

السياق العام

يمكننا جمع كائنات من أصناف مختلفة في قائمة واحدة، والتعامل معها باعتبار المشترك بينها (الشكل). قد تضم القائمة أكثر من كائن من الصنف نفسه؛ هنا ننشئ مستطيلين بأبعاد مختلفة، إلى جانب مثلث ومربع:

بالوراثة نجمع المشترك في صنف عام، ونخصّص ما يختلف في الأصناف الخاصة. ويمكن إنشاء كائنات عديدة من كل صنف، لكل منها بياناته، والتعامل معها جميعًا من خلال الخصائص والطرائق المشتركة.