Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/annatsepilova/goit-pycore-hw-07

tasks for learning Python
https://github.com/annatsepilova/goit-pycore-hw-07

python

Last synced: 4 days ago
JSON representation

tasks for learning Python

Awesome Lists containing this project

README

        

# Тема 10. Розширене Об'єктно-Орієнтоване Програмування в Python

## Завдання 1

По перше додамо додатковий функціонал до класів з попередньої домашньої роботи:

Додайте поле `birthday` для дня народження в клас `Record`. Це поле має бути класу `Birthday`. Це поле не обов'язкове, але може бути тільки одне.

```
class Birthday(Field):
def __init__(self, value):
try:
# Додайте перевірку коректності даних
# та перетворіть рядок на об'єкт datetime
except ValueError:
raise ValueError("Invalid date format. Use DD.MM.YYYY")

class Record:
def __init__(self, name):
self.name = Name(name)
self.phones = []
self.birthday = None
```

- Додайте функціонал роботи з `Birthday` у клас `Record`, а саме функцію `add_birthday`, яка додає день народження до контакту.
- Додайте функціонал перевірки на правильність наведених значень для полів `Phone`, `Birthday`.
- Додайте та адаптуйте до класу `AddressBook` нашу функцію з четвертого домашнього завдання, тиждень 3, `get_upcoming_birthdays`, яка для контактів адресної книги повертає список користувачів, яких потрібно привітати по днях на наступному тижні.

Тепер ваш бот повинен працювати саме з функціоналом класу `AddressBook`. Це значить, що замість словника contacts ми використовуємо `book = AddressBook()`

## Завдання 2

Для реалізації нового функціоналу також додайте функції обробники з наступними командами:

- `add-birthday` - додаємо до контакту день народження в форматі `DD.MM.YYYY`
- `show-birthday` - показуємо день народження контакту
- `birthdays` - повертає список користувачів, яких потрібно привітати по днях на наступному тижні

```
@input_error
def add_birthday(args, book):
# реалізація

@input_error
def show_birthday(args, book):
# реалізація

@input_error
def birthdays(args, book):
# реалізація
```

Тож в фіналі наш бот повинен підтримувати наступний список команд:

1. **add** **[ім'я]** **[телефон]**: Додати або новий контакт з іменем та телефонним номером, або телефонний номер к контакту який вже існує.
2. **hange** **[ім'я]** **[старий телефон]** **[новий телефон]**: Змінити телефонний номер для вказаного контакту.
3. **phone** **[ім'я]**: Показати телефонні номери для вказаного контакту.
4. **all**: Показати всі контакти в адресній книзі.
5. **add-birthday** **[ім'я]** **[дата народження]**: Додати дату народження для вказаного контакту.
6. **show-birthday** **[ім'я]**: Показати дату народження для вказаного контакту.
7. **birthdays**: Показати дні народження, які відбудуться протягом наступного тижня.
8. **hello**: Отримати вітання від бота.
9. **close** або **exit**: Закрити програму.

```
def main():
book = AddressBook()
print("Welcome to the assistant bot!")
while True:
user_input = input("Enter a command: ")
command, *args = parse_input(user_input)

if command in ["close", "exit"]:
print("Good bye!")
break

elif command == "hello":
print("How can I help you?")

elif command == "add":
# реалізація

elif command == "change":
# реалізація

elif command == "phone":
# реалізація

elif command == "all":
# реалізація

elif command == "add-birthday":
# реалізація

elif command == "show-birthday":
# реалізація

elif command == "birthdays":
# реалізація

else:
print("Invalid command.")

```

Для прикладу розглянемо реалізацію команди `add [ім'я] [телефон]`. В функції `main` ми повинні додати обробку цієї команди, в відповідне місце:

```
elif command == "add":
print(add_contact(args, book))
```

Сама реалізація функції `add_contact` може виглядати наступним чином:

```
@input_error
def add_contact(args, book: AddressBook):
name, phone, *_ = args
record = book.find(name)
message = "Contact updated."
if record is None:
record = Record(name)
book.add_record(record)
message = "Contact added."
if phone:
record.add_phone(phone)
return message

```

Наша функція `add_contact` має два призначення - додавання нового контакту або оновлення телефону для контакту, що вже існує в адресній книзі.

Параметри функції це список аргументів `args` та сама адресна книга `book`.

Спочатку функція розпаковує список `args`, отримуючи ім'я `name` і телефон `phone` з перших двох елементів списку. Решта аргументів ігнорується завдяки використанню. Далі метод `find` об'єкта `book` виконує пошук запису з іменем `name`. Якщо запис з таким іменем існує, метод повертає цей запис, інакше повертається `None`.
Якщо запис не знайдено, то це новий контакт і функція створює новий об'єкт `Record` з іменем `name` і додає його до `book` викликом методу `add_record`. Після додавання нового запису змінній `message` присвоюється повідомлення `"Contact added."` успішності операції.
Далі незалежно від того, чи був запис знайдений або створений новий, до цього запису додається телефонний номер за допомогою методу `add_phone`, якщо він був наданий. На завершення функція повертає повідомлення про результат своєї роботи: `"Contact updated."`, якщо контакт був оновлений, або `"Contact added."`, якщо контакт був доданий. Для перехоплення помилок вводу та виведення відповідного повідомлення про помилку використовуємо декоратор `@input_error`.