الفصل 13

الفصل 13

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

1.
a. الدونات نوع من المعجنات، لذا ترث Doughnut من Pastry.
2.
b. يحتوي المطبخ على مجمّد، لذا فإن الصنف Kitchen سيحتوي على مثيل من Freezer. تُسمى علاقة "يحتوي-على" أيضًا تركيبًا.
3.
b. يرث الصنف Goalkeeper (حارس مرمى) من الصنف Player (لاعب).
4.
b. يتبع اسم الصنف الفرعي اسم الصنف الأساسي بين قوسين.
5.
a. يُحدَّد اشتقاق CarryOn من Luggage في تعريف الصنف الخاص بـ CarryOn. مثال: class CarryOn(Luggage): . تُنشأ مثيلات من الصنف الفرعي، مثل CarryOn، مثل الأصناف الأخرى ولا تتطلب اسم الصنف الأساسي.
6.
c. يمتلك مثيل من SubClass صلاحية الوصول إلى func_1()، الموروثة من SuperClass، وكذلك إلى func_2()، وهو تابع (method) خاص بـ SubClass.
7.
a. يمتلك مثيل من SuperClass صلاحية الوصول إلى func_1() الخاص بـ SuperClass ولكن ليس لديه صلاحية الوصول إلى أي شيء في SubClass، بما في ذلك func_2().

13.2 الوصول إلى السمات

1.
b. dev_1 هو ثاني كائن (object) من Employee تم إنشاؤه. لذا، dev_1 هو الكائن الثاني الذي يستدعي Employee.__init__()، ويُسند إلى dev_1.e_id القيمة 2 .
2.
a. لم يتم تعريف __init__() الخاص بـ SubClass' بشكل صريح، لذا يتم تنفيذ __init__() الخاص بـ SuperClass'.
3.
b. يرث dc_1 السمتين feat_1 و feat_2 من SuperClass.
4.
b. dev_display() هو تابع خاص بـ Developer يصل إلى سمة المثيل lang_xp الخاصة بـ dev_1.
5.
c. dev_display() هو تابع خاص بـ Developer. emp_1 ليس مثيلًا من Developer، لذا لا يمكن لـ emp_1 الوصول إلى dev_display().
6.
a. يتم الوصول إلى سمات المثيل الموروثة من Employee، وهو الصنف الأساسي، بالطريقة نفسها للوصول إلى سمات المثيل الخاصة بالصنف الفرعي Developer.

13.3 التوابع

1.
b. تتضمن إعادة التعريف تعريف تابع الصنف الفرعي الذي يحمل نفس اسم تابع الصنف الأساسي.
2.
b. المُعامِل self مفقود من تعريف التابع المُعاد تعريفه.
3.
c. لا يشير تعريف الصنف إلى الوراثة. يجب أن يكون التعريف: class ContractTax(Tax):.
4.
b. الصنف الأساسي لـ Square هو Rectangle. يُستدعى __init__() الخاص بـ Rectangle في السطر 6.
5.
a. super().__init__(4) يستدعي __init__() الخاص بالصنف الأساسي لـ Rectangle، وهو Polygon. ينتقل التحكم إلى السطر 3، ويُهيّأ num_sides بالقيمة 4.
6.
b. تُهيّأ سمة المثيل side بالقيمة 5.
7.
b. يستدعي __init__() الخاص بـ Rectangle' دائمًا __init__() الخاص بـ Polygon مع num_sides=4.
8.
c. يسمح تعدد الأشكال بإعادة تعريف print_type() في الأصناف الفرعية لـ Polygon.
9.
a. يمكن استخدام العامل * مع معاملات عددية صحيحة وكذلك مع السلاسل النصية والأنواع الأخرى.

13.4 الوراثة الهرمية

1.
a. الصنف Class A هو الصنف الأساسي للصنف Class B والصنف Class C.
2.
b. سيكون Employee صنفًا أساسيًا مناسبًا لـ Developer و SalesRep. Developer و SalesRep غير مرتبطان مباشرة .
3.
a. B(2) يُكافئ B(2, 0)، حيث أن b_attr له قيمة افتراضية هي 0 . يُسند إلى a_attr القيمة 2 .
4.
b. يمتلك c_inst صلاحية الوصول إلى سمة المثيل الخاصة بـ C، وهي c_attr، وكذلك السمة الموروثة من A، وهي a_attr.
5.
b. D، الذي يرث من B، لذا يرث d_inst السمة b_attr. B يرث أيضًا من A، لذا يرث d_inst السمة d_attr.

13.5 الوراثة المتعددة وأصناف mixin

1.
a. 1 هو الوسيط الذي يُمرر إلى __init__() الخاص بـ C للمُعامِل a_attr.
2.
b. لم يتم تمرير وسيط إلى __init__() الخاص بـ C للمُعامِل c_attr، لذا يُسند إلى c_attr القيمة الافتراضية، وهي 20 .
3.
a. 2 يتطابق مع المُعامِل b_attr في __init__() الخاص بـ B.
4.
a. ينطبق eat() فقط على النباتات الآكلة للحوم، التي يمثلها Pitcher و VenusFlyTrap.
5.
b. يمكن نقل eat() إلى صنف mixin يتم تضمينه في قائمة الوراثة الخاصة بـ Pitcher وVenusFlyTrap.
6.
b. من الممارسة الجيدة أن ينتهي اسم صنف mixin بـ "Mixin" لتوضيح غرض الصنف. والتطبيق النهائي هو:
class Plant:
  def photosynth(self):
    print("Photosynthesizing")

class CarnivMixin:
  def eat(self):
    print("Eating")

class Rose(Plant):
  pass

class Pitcher(Plant, CarnivMixin):
  pass

class VenusFlyTrap(Plant, CarnivMixin)
  pass