時鐘

時鐘

簡單

說明

實作一個時鐘,用來處理不含日期的時間。

你應該要能對它加上或減去分鐘。

兩個代表相同時間的時鐘應該彼此相等。

這個練習在 Python Track 上如何實作

這個練習的測試預期你的時鐘會以一個 Clock class 來實作。 如果你不熟悉 Python 的類別,[concept:python/classes]() 和 類別(出自 Python 官方文件)都是很好的起點。

為你的類別建立表示方式

在操作和除錯物件時,有一個良好的物件表示方式很重要。 舉例來說,如果你在 Python REPL 環境中建立一個新的 datetime.datetime 物件,你就可以查看它的字串表示方式:

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

你的 Clock class 應該建立一個自訂的 object,用來處理_不含_日期的時間。 這個 class 的一個重要面向,就是它如何以_字串_表示。 其他使用或呼叫由 Clock class 建立的 Clock objects 的開發者,會為了除錯和其他活動而參考這個字串表示方式。 不過,自訂 class 的預設表示方式幫助不大:

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

若要建立更有幫助的表示方式,你可以在 class 上定義一個特殊方法 __repr__。

理想情況下,那個 __repr__ 方法會回傳有效的 Python 程式碼,這段程式碼傳給 eval() 後可以用來重新建立該物件,正如__repr__ 方法的規格所描述的那樣。 回傳有效的 Python 程式碼,可以讓其他開發者把 str 直接複製貼上到程式碼或 REPL 中。 一個代表上午 11:30 的 Clock 可能長這樣:

 `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 物件將自己轉換成字串表示時,它會回傳一個依照 ISO 8601 標準格式化的 str,大多數 datetime 函式庫都能將它解析成人類可讀的日期和時間。

在這個練習中,你將有機會為你的 Clock 撰寫 __str__ 方法,以及 __repr__ 方法。

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

為了支援這種字串轉換,你需要在你的 class 上建立一個 __str__ 特殊方法,回傳一個更具「人類可讀」性、顯示時鐘時間的字串。

如果你沒有建立 __str__ 方法,卻對你的類別呼叫 str(),Python 會退而嘗試呼叫你類別上的 __repr__。 所以如果你只想實作這兩個特殊方法的其中一個,最好建立 __repr__,而不是只建立 __str__。


出處

與 Erin Drummond 的結對工作階段
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Python Exercism

準備好開始 時鐘 了嗎?

註冊 Exercism,透過 17 個概念146 個練習 和真人引導來學習並精通 Python,全部免費。