13.1 أساسيات الوراثة
أهداف التعلم
في نهاية هذا القسم، ينبغي أن تكون قادرًا على
- تحديد العلاقات من نوع "هو-أ" و "يحتوي-على" بين الأصناف.
- التمييز بين الصنف الفرعي (subclass) والصنف الأساسي (superclass).
- إنشاء صنف أساسي، وصنف فرعي، ومثيلات (instances) من كل منهما.
علاقات "هو-أ" مقابل "يحتوي-على"
ترتبط الأصناف ببعضها. توجد علاقة "هو-أ" بين الصنف الفرعي والصنف الأساسي. مثال: النرجس هو نبات. يرث الصنف Daffodil من الصنف الأساسي Plant.
يمكن الخلط بين علاقات "هو-أ" وعلاقات "يحتوي-على". توجد علاقة "يحتوي-على" بين صنف يحتوي على صنف آخر. مثال: الموظف لديه حاسوب محمول صادر عن الشركة. ملاحظة: الحاسوب المحمول ليس موظفًا.
مفاهيم تطبيقية
العلاقات بين الأصناف
الوراثة في بايثون
تستخدم الوراثة (inheritance) علاقة "هو-أ" لوراثة صنف من صنف أساسي. يرث الصنف الفرعي جميع سمات (attributes) وتوابع (methods) الصنف الأساسي، ويوسع وظائف الصنف الأساسي.
في بايثون، يُنشأ الصنف الفرعي بتضمين اسم الصنف الأساسي بين قوسين في بداية تعريف الصنف الفرعي:
class SuperClass:
# سمات وتوابع الصنف الأساسي
class SubClass(SuperClass):
# سمات وتوابع الصنف الفرعي
مفاهيم تطبيقية
إنشاء أصناف فرعية
مصطلحات الوراثة البديلة
تستخدم وثائق بايثون الخاصة بالوراثة مصطلحات متعددة للإشارة إلى الصنف الموروث منه والصنف الذي يرث. يستخدم هذا الكتاب مصطلحي الصنف الأساسي/الفرعي (superclass/subclass) في جميع أنحائه لتحقيق الاتساق.
| الصنف الموروث منه | الصنف الذي يرث |
|---|---|
| الصنف الأساسي (superclass) | الصنف الفرعي (subclass) |
| الصنف الأساسي (base class) | الصنف المشتق (derived class) |
| الصنف الأب (parent class) | الصنف الابن (child class) |
جرّب بنفسك
صنفا 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".
أنشئ مثيلاً من كل صنف، ثم نادِ لكل مثيل جميعَ التوابع التي تستطيع الوصول إليها.