ساعت

ساعت

آسان

دستورالعمل‌ها

ساعتی پیاده‌سازی کنید که زمان را بدون تاریخ مدیریت می‌کند.

باید بتوانید به آن دقیقه اضافه کنید و از آن دقیقه کم کنید.

دو ساعتی که یک زمان یکسان را نشان می‌دهند باید با هم برابر باشند.

این تمرین برای مسیر پایتون چگونه پیاده‌سازی شده است

تست‌های این تمرین انتظار دارند که ساعت شما در قالب یک class به اسم Clock پیاده‌سازی شود. اگر با کلاس‌ها در پایتون آشنایی ندارید، classes و classes (از مستندات پایتون) نقطه‌های خوبی برای شروع هستند.

نمایش کلاس شما

وقتی با objects کار می‌کنید و آن‌ها را debug می‌کنید، داشتن نمایشی خوب از آن شیء مهم است. برای مثال، اگر بخواهید یک شیء تازه‌ی datetime.datetime در محیط REPL پایتون بسازید، می‌توانید نمایش رشته‌ای آن را ببینید:

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

کلاس Clock شما باید یک object سفارشی بسازد که زمان‌ها را بدون تاریخ مدیریت می‌کند. یکی از جنبه‌های مهم این class نحوه‌ی نمایش آن به شکل یک رشته است. برنامه‌نویسان دیگری که از objects ساخته‌شده از کلاس Clock استفاده می‌کنند یا آن‌ها را فراخوانی می‌کنند، برای debug و کارهای دیگر به همین نمایش رشته‌ای مراجعه می‌کنند. با این حال، نمایش پیش‌فرض یک class سفارشی چندان کمک‌کننده نیست:

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

برای ساختن نمایشی کمک‌کننده‌تر، می‌توانید یک متد ویژه __repr__ روی class تعریف کنید.

در حالت آرمانی، متد __repr__ کد معتبری از پایتون برمی‌گرداند که وقتی به eval() داده شود می‌توان با آن شیء را دوباره ساخت، همان‌طور که در مشخصات یک متد __repr__ آمده است. برگرداندن کد معتبر پایتون به برنامه‌نویس دیگری اجازه می‌دهد که str را مستقیم در کد یا در REPL کپی‌پیست کند. یک Clock که ساعت ۱۱:۳۰ صبح را نمایش می‌دهد می‌تواند این‌گونه باشد:

 `Clock(11, 30)`

تعریف یک متد __repr__ برای همه‌ی کلاس‌های سفارشی روش خوبی است. چند نکته‌ی دیگر هم هست که باید در نظر بگیرید:

  • اطلاعاتی که این متد برمی‌گرداند باید هنگام debug کردن مشکلات مفید باشد.
  • در حالت آرمانی، متد رشته‌ای برمی‌گرداند که کد معتبر پایتون است، هرچند همیشه ممکن نیست.
  • اگر کد معتبر پایتون عملی نیست، برگرداندن یک توضیح میان دو علامت کوچک‌تر و بزرگ‌تر، یعنی < ...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 می‌توانند آن را به تاریخ و زمانی خوانا برای انسان تبدیل کنند.

در این تمرین، فرصتی خواهید داشت که برای Clock خود یک متد __str__ و همچنین یک متد __repr__ بنویسید.

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

برای پشتیبانی از این تبدیل رشته، باید روی class خود یک متد ویژه‌ی __str__ بسازید که رشته‌ای باز هم «خوانا برای انسان» و نشان‌دهنده‌ی زمان Clock را برگرداند.

اگر متد __str__ نسازید و str() را روی کلاس خود فراخوانی کنید، پایتون به‌عنوان جایگزین تلاش می‌کند __repr__ را روی کلاس شما فراخوانی کند. بنابراین اگر فقط یکی از این دو متد ویژه را پیاده‌سازی می‌کنید، بهتر است __repr__ را بسازید نه فقط __str__ را.


منبع

جلسه‌ی برنامه‌نویسی دونفره با Erin Drummond
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Python Exercism

آماده‌اید ساعت را شروع کنید؟

در Exercism ثبت‌نام کنید تا Python را همراه با 17 مفهوم146 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.