الساعة

الساعة

سهل

التعليمات

نفّذ ساعة تتعامل مع الأوقات بدون تواريخ.

ينبغي أن تكون قادرًا على إضافة دقائق إليها وطرحها منها.

ينبغي أن تتساوى ساعتان تمثلان الوقت نفسه.

كيف يُنفَّذ هذا التمرين في مسار Python

تتوقّع اختبارات هذا التمرين أن تُنفَّذ ساعتك على هيئة class باسم Clock. إذا لم تكن معتادًا على الأصناف في Python، فإن classes والأصناف (من توثيق Python) نقطتان جيدتان للبدء.

تمثيل صنفك

عند العمل مع الكائنات وتصحيح أخطائها، من المهم أن يكون لديك تمثيل جيد لهذا الكائن. على سبيل المثال، إذا أنشأت كائنًا جديدًا من datetime.datetime في بيئة REPL الخاصة بـ Python، فيمكنك عرض تمثيل السلسلة النصية الخاص به:

>>> from datetime import datetime
>>> new_date = datetime(2022, 5, 4)
>>> new_date
datetime.datetime(2022, 5, 4, 0, 0)

ينبغي أن يُنشئ class الساعة object مخصصًا يتعامل مع الأوقات بدون تواريخ. أحد الجوانب المهمة في class هذا هو كيفية تمثيله على هيئة سلسلة نصية. سيعتمد المبرمجون الآخرون الذين يستخدمون أو يستدعون objects الساعة المنشأة من class الساعة على تمثيل السلسلة النصية هذا عند تصحيح الأخطاء والقيام بأنشطة أخرى. لكن التمثيل الافتراضي في class مخصص ليس مفيدًا كثيرًا:

>>> Clock(12, 34)
<Clock object st 0x102807b20 >

لإنشاء تمثيل أكثر فائدة، يمكنك تعريف __repr__، وهي طريقة خاصة، على class.

من المثالي أن تُرجع طريقة __repr__ تلك كود Python صالحًا يمكن استخدامه لإعادة إنشاء الكائن عند تمريره إلى eval()، على النحو الموضّح في مواصفات طريقة __repr__. إرجاع كود Python صالح يتيح لمبرمج آخر نسخ str ولصقه مباشرةً في الكود أو في REPL. قد يبدو Clock الذي يمثّل 11:30 صباحًا هكذا:

 `Clock(11, 30)`

تعريف طريقة __repr__ ممارسة جيدة لجميع الأصناف المخصصة. بعض الأمور الإضافية التي ينبغي مراعاتها:

  • ينبغي أن تكون المعلومات التي تُرجعها هذه الطريقة مفيدة عند تصحيح المشكلات.
  • من المثالي أن تُرجع الطريقة سلسلة نصية تمثّل كود Python صالحًا، وإن لم يكن ذلك ممكنًا دائمًا.
  • إذا لم يكن إرجاع كود Python صالح عمليًا، فالعُرف هو إرجاع وصف بين الأقواس الزاوية: < ...a practical description... >.

تحويل السلسلة النصية

بالإضافة إلى طريقة __repr__، قد تحتاج أيضًا إلى تمثيل بديل للسلسلة النصية خاص بـ class يكون "مقروءًا للبشر". قد يُستخدم هذا لتنسيق الكائن لمخرجات البرنامج أو للتوثيق. ويتم ذلك بكتابة طريقة خاصة هي __str__. ولننظر إلى datetime.datetime مرة أخرى:

>>> str(datetime.datetime(2022, 5, 4))
'2022-05-04 00:00:00'

عندما يُطلب من كائن datetime أن يحوّل نفسه إلى سلسلة نصية، فإنه يُرجع str منسّقًا وفقًا لـمعيار ISO 8601، وهو ما يمكن لمعظم مكتبات datetime تحليله إلى تاريخ ووقت مقروءين للبشر.

في هذا التمرين، ستتاح لك فرصة كتابة طريقة __str__ لساعتك، وكذلك طريقة __repr__.

>>> str(Clock(11, 30))
'11:30'

لدعم تحويل السلسلة النصية هذا، ستحتاج إلى إنشاء طريقة __str__ خاصة على class الخاص بك، تُرجع سلسلة نصية أكثر "قابلية للقراءة" تعرض وقت الساعة.

إذا لم تُنشئ طريقة __str__ واستدعيت str() على صنفك، فسيحاول Python استدعاء __repr__ على صنفك كخيار احتياطي. لذا إذا نفّذت واحدة فقط من هاتين الطريقتين الخاصتين، فمن الأفضل إنشاء __repr__ بدلًا من __str__ فقط.


المصدر

جلسة برمجة ثنائية مع Erin Drummond
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Python Exercism

مستعد لبدء الساعة؟

سجّل في Exercism لتتعلّم وتتقن Python عبر 17 مفهومًا146 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.