الدرس 7 من 10
خاصية تتحقّق من قيمتها
- 13 دقيقة
- 6 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
كل قيمة جديدة تمرّ بالتحقّق
الشرح
الحقل العادي مثل t.celsius بسيط، لكن أي سطر في البرنامج يستطيع أن يضع فيه -300. أما @property فتجعل الوصول إليه استدعاءً لدالة مع بقاء طريقة الكتابة نفسها، فتقرأ القيمة بـ t.celsius، وإذا كتبت t.celsius = 30 مرّت القيمة بدالة إسناد (setter) فوقها @celsius.setter تتحقّق منها قبل أن تحفظها.
لذلك لا تحتاج في Python إلى كتابة دوال get_ وset_ مسبقًا، بل ابدأ بحقل عادي، وحين تحتاج إلى التحقّق حوّله إلى خاصية (property)، فلا يتغيّر سطر واحد عند من يستعمل الصنف. والخاصية التي ليس لها دالة إسناد تكون للقراءة فقط، وتناسب القيم المحسوبة مثل fahrenheit.
والفخّ هنا أن عليك داخل دالة الإسناد أن تحفظ القيمة في اسم آخر مثل self._celsius، لأنك لو كتبت self.celsius = value لاستدعت الدالة نفسها بلا نهاية حتى يقع الخطأ RecursionError. أمّا في __init__ فاكتب self.celsius عن قصد، ليمرّ الإنشاء بالتحقّق نفسه.
المطلوب
اجعل celsius في Temperature خاصية ترفع ValueError لأي قيمة أقلّ من -273.15، عند الإنشاء وعند الإسناد، وأضف fahrenheit خاصية للقراءة فقط تساوي celsius * 9 / 5 + 32.
الفحوص
6 فحوص- الخاصية celsius تُقرأ كحقل عادي
- الخاصية fahrenheit محسوبة من celsius
- الخاصية fahrenheit تتغيّر مع celsius
- إسناد قيمة تحت الصفر المطلق يرفع ValueError ولا يغيّر القيمة
- الإنشاء بقيمة مستحيلة مرفوض كذلك
- الخاصية fahrenheit للقراءة فقط