توابع المثيل

11.3 توابع المثيل

أهداف التعلم

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

  • إنشاء وتطبيق الدالّة __init__() مع مُعامِلات متعددة، بما في ذلك قيم المُعامِلات الافتراضية.
  • وصف المعلومات التي يمكن لتابع المثيل الوصول إليها وتعديلها.

المزيد عن الدالّة __init__()

في Python، الدالّة __init__() هي التابع الخاص الذي ينشئ المثيلات. ينبغي أن تحتوي الدالّة __init__() على المثيل المستدعي، self، كأول مُعامِل، ويمكن أن تحتوي على أي عدد من المُعامِلات الأخرى بقيم افتراضية للمُعامِلات أو بدونها.

نقطة تحقق

إنشاء مثيلات علامات المريض الحيوية

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

تعريف واستخدام الدالّة __init__() مع المُعامِلات

تأمل المثال أعلاه.

1.
افترض أن المبرمج أراد جعل ضغط الدم مُعامِلًا إلزاميًا في الدالّة __init__(). ما الترويسة الصحيحة لتابع __init__()؟
  1. def __init__(p_id, bp, self, tmp=-1.0, hr=-1, rr=-1):
  2. def __init__(self, p_id, bp, tmp=-1.0, hr=-1, rr=-1):
  3. def __init__(self, p_id, bp=[-1,-1], tmp=-1.0, hr=-1, rr=-1):
2.
ما الاستدعاء الصحيح للدالّة __init__() لإنشاء مثيل بمعرف المريض p_id=5241؟
  1. patient_10 = Vitals(self, 5241)
  2. patient_10 = Vitals(5241)
  3. كلاهما
3.
افترض أنه أُضيف تعريف آخر للدالّة __init__() بعد الأول بالترويسة التالية:
def __init__(self, p_id, bp, tmp, hr, rr)
ما التأثير على البرنامج؟
  1. لا تغيير.
  2. التعريف الثاني للدالّة __init__() ينتج خطأً.
  3. أول استدعاءين للدالّة __init__() ينتجان خطأً.

توابع المثيل

يُستخدم تابع المثيل للوصول إلى سمات المثيل وسمات الصنف وتعديلها. جميع التوابع المعروضة حتى الآن، ومعظم التوابع المُعرَّفة في تعريف الصنف، هي توابع مثيلات.

مثال 11.1

غالبًا ما تُستخدم توابع المثيل للحصول على معلومات المثيل وتعيينها

  class ProductionCar:
    def __init__(self, make, model, year, max_mph = 0.0):
      self.make = make
      self.model = model
      self.year = year
      self.max_mph = max_mph

    def max_kmh(self):
      return self.max_mph * 1.609344

    def update_max(self, speed):
      self.max_mph = speed

  car_1 = ProductionCar('McLaren', 'Speedtail', 2020) # car_1.max_mph تساوي 0.0
  car_1.update_max(250.0) # car_1.max_mph تساوي 250.0
  print(car_1.make, car_1.model, 'reaches', car_1.max_mph, 'mph (',
    car_1.max_kmh(), 'km/h)') # تطبع: McLaren Speedtail reaches 250.0 mph (402.336 km/h)
  

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

توابع المثيل CoffeeOrder

تأمل المثال أدناه:

  class CoffeeOrder:
    loc = 'Cafe Coffee'
    cls_id = 1

    def __init__(self, size=16, milk=False, sugar=False):
      self.order_id = CoffeeOrder.cls_id
      self.cup_size = size
      self.with_milk = milk
      self.with_sugar = sugar
      CoffeeOrder.cls_id += 1

    def change(self, milk, sugar):
      self.with_milk = milk
      self.with_sugar = sugar

    def print_order(self):
      print(CoffeeOrder.loc,'Order', self.order_id, ':', self.cup_size, 'oz')
      if self.with_milk:
        print('\twith milk')
      if self.with_sugar:
        print('\twith sugar')
  
  order_1 = CoffeeOrder(8)
  order_2 = CoffeeOrder(8, True, False)
  order_1.change(False, True)
  
4.
ماذا يمثل order_1 في نهاية البرنامج؟
  1. قهوة بحجم 8 أونصة
  2. قهوة بحجم 8 أونصة مع حليب
  3. قهوة بحجم 8 أونصة مع سكر
5.
لماذا الدالّة change() هي تابع مثيل؟
  1. يمكنها تغيير السمات
  2. لديها مُعامِلات متعددة
  3. يمكنها تغيير مثيل
6.
هل يمكن إزالة مسافة البادئة من الدالّة print_order()؟
  1. نعم
  2. لا

جرّب بنفسك

إنشاء صنف لآلات البيع

اكتب صنفًا، VendingMachine، كما هو موضح أدناه. القيم الافتراضية تتبع السمات. مثال: القيمة الافتراضية لـ count هي 0. أنشئ آلة بيع باستخدام قيمة مقروءة من الإدخال واستدعِ توابع المثيل.

سمات المثيل:

  • count: 0
  • max: 0

التوابع:

  • __init__(num): تهيئ count و max باستخدام المُعامِل num
  • refill(): تُسند count بقيمة max وتطبع "Refilled"
  • sell(order): تُسند count بقيمة count مطروحًا منها order وتطبع "Sold: [order]"
  • print_stock(): تطبع "Current stock: [count]"

الإدخال المُعطى:

  100
  25
  

الإخراج هو:

  Current stock: 100
  Sold: 25
  Current stock: 75
  Refilled
  Current stock: 100