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

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

أهداف التعلم

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

  • تطبيق صنف فرعي يصل إلى السمات الموروثة من الصنف الأساسي.
  • كتابة الدالّة __init__() لصنف فرعي يرث سمات المثيل من الصنف الأساسي وينشئ سمات مثيل جديدة.

إنشاء صنف فرعي بسيط

تتمتع الأصناف الفرعية بالوصول إلى السمات الموروثة من الصنف الأساسي. عندما لا تُعرَّف الدالّة __init__() للصنف الفرعي بشكل صريح، يُستدعى تابع __init__() للصنف الأساسي. ولا يختلف أسلوب الوصول إلى كلا نوعَي السمات.

نقطة تحقق

تعريف صنف فرعي بسيط

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

استخدام الأصناف الفرعية البسيطة

1.
تأمل مثال Employee و Developer أعلاه. ما قيمة dev_1.e_id؟
  1. 1
  2. 2
  3. Error
2.
تأمل المثال التالي. يُنفَّذ السطر 13 ويُستدعى SubClass(). إلى أي سطر ينتقل سير التنفيذ؟
1
class SuperClass:
2
  def __init__(self):
3
    self.feat_1 = 1
4
    self.feat_2 = ""
5
6
  def bc_display(self):
7
    print(f"Superclass: {self.feat_2}")
8
9
class SubClass(SuperClass):
10
  def dc_display(self):
11
    print(f"Subclass: {self.feat_2}")
12
13
dc_1 = SubClass()
  1. 2
  2. 10
  3. Error
3.
تأمل المثال التالي. ما سمات المثيل التي يمتلكها dc_1؟
class SuperClass:
  def __init__(self):
    self.feat_1 = 1
    self.feat_2 = ""

  def bc_display(self):
    print(f"Superclass: {self.feat_2}")

class SubClass(SuperClass):
  def dc_display(self):
    print(f"Subclass: {self.feat_2}")

dc_1 = SubClass()
  1. feat_2
  2. feat_1 و feat_2
  3. لا شيء

استخدام __init__() لإنشاء ووراثة سمات المثيل

غالبًا ما يرغب المبرمج في أن يمتلك الصنف الفرعي سمات مثيل جديدة بالإضافة إلى تلك الموروثة من الصنف الأساسي. يشمل التعريف الصريح للدالّة __init__() في الصنف الفرعي تحديدَ سمات المثيل الجديدة وتهيئةَ السمات الموروثة من الصنف الأساسي.

نقطة تحقق

تعريف __init__() في صنف فرعي

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

الوصول إلى سمات الصنف الفرعي

تأمل شفرةَ مثال Employee و Developer:

    class Employee:
      count = 0
      def __init__(self):
        Employee.count += 1
        self.e_id = Employee.count
        self.hire_year = 2023

      def emp_display(self):
        print(f"Employee {self.e_id} hired in {self.hire_year}")

    class Developer(Employee):
      def __init__(self):
        Employee.count += 1
        self.e_id = Employee.count
        self.hire_year = 2023
        self.lang_xp = ["Python", "C++", "Java"]

      def dev_display(self):
        print(f"Proficient in {self.lang_xp}")
    
    emp_1 = Employee()
    dev_1 = Developer()
4.
ماذا سيكون إخراج dev_1.dev_display()؟
  1. Employee 2 hired in 2023
  2. Proficient in ['Python', 'C++', 'Java']
  3. Error
5.
ماذا سيكون إخراج emp_1.dev_display()؟
  1. Employee 1 hired in 2023
  2. Proficient in ['Python', 'C++', 'Java']
  3. Error
6.
افترض أنه يجب تعديل dev_display() لعرض معرف المطور (ID) بالإضافة إلى كفاءاته. مثال: dev_1.dev_display() سيُخرج Employee 2 proficient in ['Python', 'C++', 'Java']. ما استدعاءُ print() الجديد المناسب داخل dev_display()؟
  1. print(f"Employee {self.e_id} proficient in {self.lang_xp}")
  2. print(f"Employee {self.Employee.e_id} proficient in {self.lang_xp}")
  3. print(f"Employee 2 proficient in {self.lang_xp}")

جرّب بنفسك

إنشاء صنف فرعي بسمة مثيل

انطلاقًا من الصنف Dessert المعطى، أنشئ صنفًا باسم Cupcake يرث منه. توابع الصنف Cupcake:

  • __init__(self): يهيئ سمة المثيل الموروثة ingredients بالقائمة ["butter", "sugar", "eggs", "flour"]، ويهيئ سمة المثيل frosting بالقيمة "buttercream"
  • display(self): يطبع مكونات الكب كيك وطبقة التزيين

ثم استدعِ التابع display() على كائن Cupcake جديد، وينبغي أن يكون الإخراج على النحو التالي:

    Made with ["butter", "sugar", "eggs", "flour"] and topped with buttercream frosting