Треки
/
Python
Python
/
Вправи
/
Годинник
Годинник

Годинник

Легка

Вказівки

Реалізуйте годинник, який працює з часом без дат.

Потрібно вміти додавати хвилини до годинника й віднімати їх від нього.

Два годинники, які показують той самий час, мають бути рівними один одному.

Як цю вправу реалізовано для треку Python

Тести цієї вправи очікують, що годинник буде реалізовано як class Clock. Якщо ми ще не працювали з класами в Python, варто почати з classes та 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 Clock має створювати власний object, який працює з часом без дат. Один важливий аспект цього class - те, як його представлено у вигляді рядка тексту (англ. string). Інші програмісти, які використовують або викликають Clock objects, створені з class Clock, будуть звертатися до цього рядкового представлення для налагодження та інших завдань. Однак типове представлення для власного class не дуже допомагає:

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

Щоб створити корисніше представлення, можна визначити __repr__ спеціальний метод у class.

У ідеалі метод __repr__ повертає коректний код Python, який можна використати, щоб відтворити обʼєкт, передавши його в eval(), як описано в специфікації методу __repr__. Повертаючи коректний код Python, ми даємо іншому розробнику змогу скопіювати str безпосередньо в код або в REPL. Clock, який представляє 11:30 AM, може мати такий вигляд:

 `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, який більшість бібліотек для роботи з датами й часом можуть розібрати у зрозумілі для людини дату й час.

У цій вправі ми матимемо нагоду написати для свого годинника метод __str__, а також метод __repr__.

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

Щоб підтримати це перетворення на рядок, потрібно створити спеціальний метод __str__ у своєму class, який повертає «зрозуміліший для людини» рядок тексту із часом годинника.

Якщо не створити метод __str__ і викликати str() для свого класу, Python спробує як запасний варіант викликати __repr__ для цього класу. Тож якщо з цих двох спеціальних методів ми реалізуємо лише один, краще створити __repr__, а не тільки __str__.


Джерело

Сесія парного програмування з Ерін Драммонд
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Python Exercism

Час розпочати Годинник?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Python, а також 17 концепцій146 вправ та справжнє наставництво від людей, і все це безкоштовно.